====== Python - snippets ======
//Utilización del lenguaje para un propósito concreto.//
===== Cómo... =====
==== Ejecutar un fichero ====
=== Un script en python ===
execfile(script_path)
=== Un ejecutable del sistema ===
path = r'c:\bsplayer' # ruta del ejecutable
import os
print os.execv((path), []) # lanza un ejecutable del sistema, el segundo parámetro son los argumentos para este.
def start (program, *args):
return os.spawnv(os.P_NOWAIT, program, (program,) + args)
start(path) # lanza un ejecutable del sistema, en Windows funciona mejor que execcv.
os.system(path) # lanza un comando mostrando por pantalla la salida de este
import subprocess
subprocess.Popen([path,'']) # una tercera forma
==== Saber ruta del ejecutable ====
import os
path = os.getcwd() # ruta del script
name = sys.argv[0] # nombre del script
exec = path + os.sep + name # ruta completa del script
==== Lanzar comando por consola y recoger salida ====
import subprocess
s1 = subprocess.check_output('ls')
s2 = subprocess.check_output(['ls', '-la'])
subprocess.getstatusoutput('ls /bin/ls') # (0, '/bin/ls')
subprocess.getoutput(cmd)
==== Llamar webservices REST ====
=== Llamada simple ===
import urllib
data = urllib.urlopen(url).read()
=== Llamada pasando parámetros POST ===
import urllib
url = 'http://xxxxxxxxxxxxx'
params = urllib.urlencode({
'appid': appid,
'context': context,
'query': query
})
data = urllib.urlopen(url, params).read()
=== Llamada con autentificación ===
import urllib2
delicious_user = 'Your del.icio.us username'
delicious_pass = 'Your del.icio.us password'
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(
None, 'https://api.del.icio.us/', delicious_user, delicious_pass
)
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
xml = urllib2.urlopen('https://api.del.icio.us/v1/posts/recent').read()
==== Detectar el final de la ejecución ====
=== Utilizar atexit ===
''atexit'' permite indicar una función que se llamará al finalizar la ejecución:
import atexit
def all_done():
print 'all_done()'
print 'Registering'
atexit.register(all_done)
print 'Registered'
Este código dará como resultado:
Registering
Registered
all_done()
Podemos pasar parámetros:
import atexit
def my_cleanup(name):
print 'my_cleanup(%s)' % name
atexit.register(my_cleanup, 'first')
atexit.register(my_cleanup, 'second')
atexit.register(my_cleanup, 'third')
=== Detectar un CTRL+C ===
Se ha de detectar la ''KeyboardInterrup'':
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread();
sys.exit()
==== Conocer las direcciones de la máquina ====
Para UNIX existe el paquete ''netifaces'':
from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
print '%s: %s' % (ifaceName, ', '.join(addresses))
Derivado de este código cómo conseguir una ip pública:
from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'127.'}] ):
if not i['addr'].startswith("127."):
return i['addr']
===== Tips =====
* Para configuración podemos agregar un fichero settings.py al proyecto. Este contendría un diccionario con las configuración deseada (par: clave, valor).
* Puedes ejecutar un módulo cual si fuese un programa haciendo ''python -m modulo''. Por ejemplo, si quisiesemos abrir un servidor web en el directorio actual:
$ python -m SimpleHTTPServer
$ python -m SimpleHTTPServer 8080
$ python -m http.server
===== Snippets =====
print map(int, "10 20 30".split()) # [10, 20, 30]
d = [1, 3, 5]
d[-1] # 5
winners = set('''washington adams jefferson jefferson madison madison
monroe monroe adams jackson jackson vanburen harrison polk taylor pierce buchanan'''.split())
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.datetime.now()
# if created has value self.created will take it, if not self.created will be datetime.now()
==== zip function ====
>>> a = ['a', 'b', 'c']
>>> c = [10, 33, 44]
>>> zip(a, c)
[('a', 10), ('b', 33), ('c', 44)]
>>> dict(zip(a, c))
{'a': 10, 'c': 44, 'b': 33}