Preguntas frecuentes de Python-ES
Table of Contents

Sobre este FAQ

¿Por qué existe este FAQ?

La lista de Python en español lleva funcionando desde abril de 2001, y en todo este tiempo ha dado respuesta a miles de preguntas. A veces, estos mensajes resuelven temas muy específicos, pero habitualmente son cuestiones recurrentes que son innecesariamente contestadas una y otra vez. Esto es malo por varias razones, por un lado se pierde mucho tiempo en asuntos que ya está más que discutidos y, por otro, tanta repetición no ayuda a diferenciar la calidad de las respuestas (esto es especialmente cierto para los programadores novatos, quienes no tienen todavía criterios sólidos en los que apoyarse)..

¿Cómo puedo colaborar?

Cualquiera puede modificar el wiki, consulta la página ¿Cómo participar?. Dale un ojeada primero las preguntas ya existentes y mira si puedes mejorar o puntualizar lo que se dice. Naturalmente, puedes crear todas las entradas nuevas que creas necesarias. Si vas a modificar una respuesta ya existente y tu razonamiento es diferente al que hizo otra persona, no lo borres y los sustituyas sin más; etiqueta el texto anterior (ej: "Respuesta 1") y añade el tuyo (ej: "Respuesta 2"). Sólo en el caso que una respuesta sea manifiestamente incorrecta puedes borrarla. Hay temas de naturaleza muy subjetiva que no tienen una respuesta única. En estos casos se recomienda dar referencias a las diversas opiniones (muy especialmente, a mensajes de la propia lista) para enriquecer el debate.

¿Que formato debo seguir para editar el wiki?

Consulta la página de ayuda: Sintaxis del wiki.

Sobre la lista de Python en español

¿Cómo me suscribo?

Ve a la página principal de la lista y busca el campo "Subscribirse a Python-es", pon tu correo electrónico, nombre y la clave para modificar tus preferencias. Una vez hecho esto recibirás un correo de confirmación, haz lo que te pide y ya podrás hacer preguntas en la lista.

¿Cómo me doy de baja?

Puedes hacerlo tú mismo de alguna de estas dos formas:

1. Ve a la página principal de la lista, busca el último campo ('correo electrónico'), pon tu correo y pulsa en el botón "Anular su suscripción o editar sus preferencias". En la página que aparece, busca el campo "Desuscribir" y pulsa el botón correspondiente.

2. Envía un mensaje de correo electrónico con el asunto "desubscribe" a <gro.nohtyp|tseuqer-se-nohtyp#gro.nohtyp|tseuqer-se-nohtyp> (fíjate, con '-request'). Si todo va bien recibirás un correo de confirmación, sólo tienes que responder a ese mensaje (para confirmar), y ya estarás desuscrito.

Si ninguna de estas dos formas te funciona, trata de contactar con algún administrador de la lista. En ningún caso deberías escribir a la lista para este asunto, pobre gente no tienen ninguna culpa.

¿Cómo desactivo temporalmente la recepción de correos?

Cuando te vas de vacaciones es habitual que no quieras recibir un correo que se va a ir acumulando. Esto es posible sin necesidad de desuscribirse: sigue los pasos para darte de baja, pero en vez de el botón "Desuscribir" introduce tu clave en el primer campo y presiona al botón "Entrar". La configuración que aparece te permite, entre muchas otras cosas, inhabilitar temporalmente la entrega de correo o activar el modo digest (los correos llegan recopilados en un único mensaje), que también te puede ser útil.

¿Puedo escribir en otros idiomas además del español?

El idioma común de los integrantes de lista es, evidentemente, el español, así que en la medida de lo posible, utilízalo. No obstante, esta no es una norma tajante: tenemos compañeros brasileños (donde hay una comunidad muy activa en Python) que escriben esporádicamente en portugués y nadie se rasga las vestiduras; toda lengua romance se entiende si pones el suficiente interés. En cualquier caso, es preferible enviar un correo bien escrito en cualquier lengua que en un pésimo español.

¿Por qué nadie me responde? Sois bastante antipáticos.

Quizá no planteaste tu consulta del modo correcto (como-preguntar). Espera un tiempo prudencial, y si realmente nadie contesta, vuelve a intentarlo (reescribe tu mensaje a conciencia, si antes no te contestaron, no hay razón de que lo hagan si lo mandas exactamente igual). Si sigue sin haber contestación quizá es que nadie sabe cómo ayudarte, pasa hasta en las mejores familias.

¿Cómo envío código a la lista?

Intenta seguir estas recomendaciones:

- El código debe ser lo más corto posible, abstráelo de su entorno (clases, variables globales, etc) y mándalo aislado.
- Si el código es un poco largo (> 50 líneas, por decir algo), súbelo a un sitio de snippets en Internet y enlázalo.
- El código debe poder ejecutarse sin ninguna modificación, no obligues a la gente a tocar el código para poder probarlo.
- Si el script usa ficheros de datos, súbelos también y enlazalos.
- Añade asserts en el código para que quede claro el resultado que esperas (y que no obtienes).

Un ejemplo:

def mi_funcion_suma(x, y):
   return x * y # bug, debería ser +
 
assert mi_funcion_suma(1, 2) == 3
assert mi_funcion_suma(1, 4) == 5

¿No hay un buscador de los archivos de la lista?

No, pero puedes usar el buscador de gmane.

Aspectos generales de Python

¿Qué es Python?

Python es un lenguaje de programación muy fácil de aprender, y tiene la gran virtud de ser a la vez sencillo y potente. Es interpretado (no existe proceso de compilación) y tiene un tipado dinámico y fuerte (lo que significa que las variables que aunque pueden cambiar de tipo (coercing), estos cambios deben ser explícitos).

Python permite varios paradigmas de programación, secuencial, orientado a objetos, funcional (al menos parcialmente), etc. Es ideal para prototipado de aplicaciones, aunque se está usando con éxito en multitud de aplicaciones finales.

Python es libre y gratuito, disponible en las plataformas mayoritarias (Linux, *BSD, *nix, Windows, MAC, algunos móviles…)

¿Cómo resumirías su historia?

Que nos lo explique su creador: entrevista con Guido von Rossum.

Juan Ignacio Rodríguez ha traducido unos artículos de Guido en los se repasa la historia de Python:

http://elornitorrincoenmascarado.blogspot.com/2009/03/introduccion-y-vision-general-historia.html

¿Qué licencia tiene? ¿es software libre?

Ver <http://www.python.org/doc/Copyright.html>

Python es un lenguaje de programación gratuito para todo uso (incluido el comercial y/o privativo), pero también libre, ya que da permiso explícito para la copia, modificación y redistribución. La licencia de Python está reconocida como libre tanto por la OSI como por el proyecto GNU.

La licencia de Python es compatible con la GNU-GPL, aunque esto no significa que Python se distribuya bajo esta licencia, sino que que puedes combinar Python con cualquier software bajo la GPL. La licencia de Python no obliga a que los trabajos derivados mantengan la misma licencia (no es copyleft, a diferencia de la GPL).

Sobre el tema de las licencias (no solo de Python, sino también de sus librerías), se abrió hace unos años un interesante hilo en la lista.

¿Qué son los PEP?

PEP significa "Python Enhancement Proposal" (Propuesta de mejora de Python), un documento estandarizado para dejar por escrito propuestas, descripciones o explicaciones del lenguaje. Guido, como BDFL (Dictador Benevolente de por vida), es el que decide los PEP que se aprueban, aunque siempre en discusión pública y abierta. El futuro de Python (Python3000) también tiene su propio PEP.

Programando en Python

Quiero aprender (o enseñar) a programar, ¿es Python una buena elección?

Python es una excelente opción para enseñar conceptos de programación a personas sin experiencia previa: es un lenguaje dinámico (no hay que declarar las variables), sencillo e intuitivo, y gracias al terminal interactivo es realmente sencillo "jugar" con él. Es, por tanto, una opción muy atractiva para enseñar informática en escuelas o institutos, cumpliendo perfectamente la misión que históricamente se atribuyó a Pascal o Basic.

¿Dónde encuentro tutoriales sobre Python?

Empieza por el tutorial oficial:

<http://pyspanishdoc.sourceforge.net/>

Una vez domines los conceptos básicos de Python y ya no tengas problemas con el lenguaje en sí, tienes todavía un largo camino por delante. En primer lugar, debes habituarte a las "formas idiomáticas" (esto es, la forma en que comúnmente se resuelven ciertos problemas típicos). Este documento es muy completo:

<http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html>

Las referencias que da al final del documento son de lectura obligada.

Si quieres tutoriales más avanzados de Python, puedes mirarte:

<http://es.diveintopython.org/>

<http://ibiblio.org/obp/thinkCS/python.php>

<http://www.rexx.com/~dkuhlman/python_201/python_201.html>

Por último, dale un ojeada también a esta completa recopilación de tutoriales:

<http://www.awaretek.com/tutorials.html>

¿Cómo resumirías la filosofía de Python?

Tim Peters lo hace de forma fantástica en estos 20 aforismos zen. Una traducción libre:

Lo bello es mejor que lo feo.
Lo simple mejor que lo complejo.
Lo complejo mejor que lo complicado.
Lo plano mejor que lo anidado.
Lo claro mejor que lo denso.
La legibilidad importa.
Los casos especiales no son suficientemente especiales como para romper las normas.
Aunque el pragmatismo somete a la pureza.
Los errores no deberían pasar silenciosamente.
A menos que sean explícitamente silenciados.
Ante la ambigüedad, evita la tentación de suponer.
Debería haber una -y preferiblemente solo una- forma obvia de hacerlo.
Aunque puede no ser tan obvia al principio, a menos que seas holandés.
Ahora es mejor que nunca.
Aunque nunca es a menudo mejor que ahora mismo.
Si la implementación es difícil de explicar, es una mala idea.
Si la implementación es fácil de explicar, puede que sea una buena idea.
Los espacios de nombres son una fantástica idea, usémoslos.

¿Cuáles son las normas generales para dar nombre a variables, funciones y métodos?

Los detalles se explican aquí:

<http://www.python.org/doc/essays/styleguide.html>

No son normas estrictas y ni siquiera los módulos oficiales la siguen (corregir estos problemas rompería mucho código antiguo y no está claro que alguna vez se haga). Para código nuevo síguelas siempre que puedas.

¿Qué diferencia hay entre definir una función con "def" o con "lambda"?

La forma general y preferida en Python para definir funciones es def. La equivalencia sería:

def funcion(arg1, arg2):
    return arg1 + arg2
 
funcion = lambda arg1, arg2: arg1 + arg2

Lambda fue un añadido al lenguaje (del que GvR se lamenta siempre que puede), y tiene características distintas. Para empezar, sólo puede contener expresiones, no statements (if, for, print, etc). En la función lambda no hay que hacer return, éste es implícito; tampoco hay paréntesis alrededor de los parámetros (si los pones les estarás diciendo que el argumento es una tupla).

Otra diferencia fundamental es que lambda puede emplearse como función anónima (no así def):

map(lambda x: 2*x, [1, 2, 3]) # [2, 4, 6]

A pesar de que lambda ha sobrevivido a todos los embates, sigue teniendo muy mala prensa entre los desarrolladores de Python:

<http://mail.python.org/pipermail/python-dev/2008-May/079137.html>

Una cosa está clara: las funciones lambda deberían usarse sólo para tareas cortas y simples. Como norma general, usa def.

¿Cómo hago una calculadora?

Python en sí es una buenísima calculadora:

import math
eval("4.0*sqrt(4)", vars(math), {}) # 8.0

Ver detalles de eval en la documentación, es una función peligrosa en cuestiones de seguridad.

Sobra decirlo: si la calculadora a desarrollar es un trabajo académico, a tu profesor no le va hacer a gustar la función eval tanto como a tí ;-)

¿Cómo obtengo el directorio home del usuario actual?

En una primera aproximación podemos acceder al diccionario con las variables de entorno (os.environ):

import os
homedir = os.environ["HOME"]

Pero no siempre la variable HOME esta establecida o apunta al directorio correcto. La mejor alternativa es os.path.expanduser, que ajusta su comportamiento según la plataforma:

import os
homedir = os.path.expanduser("~")

¿Cómo puedo procesar los ficheros de texto?

El caso más simple es procesar línea a línea un fichero de entrada:

for line in file(fichero):
    print line # aquí procesamos

Veamos un ejemplo: queremos leer del fichero entrada.txt y escribir en salida.txt sólo las líneas que empiecen por la palabra frecuencia, ignorando si tiene espacio delante.

1ª propuesta: usando métodos de cadena.

output = file("salida.txt", "w")
for line in file("entrada.txt"):
    if line.lstrip().startswith("frecuencia"):
        output.write(line)
output.close()

2ª propuesta: usando métodos de cadena y el método writelines con generadores.

output = file("salida.txt", "w")
condition = lambda s: s.lstrip().startswith("frecuencia")
output.writelines(line for line in file("entrada.txt") if condition(line))
output.close()

3ª propuesta: usando métodos de cadena, y leyendo/escribiendo en una misma línea con generadores (para los amantes de la programación funcional).

from itertools import ifilter
condition = lambda s: s.lstrip().startswith("frecuencia")
output = ifilter(condition, file("entrada.txt"))
file("salida.txt", "w").writelines(output)

4ª propuesta: usando expresiones regulares. En este caso tan simple no está justificado, pero a veces la búsqueda puede ser más compleja y entonces sí puede ser útil.

import re
output = file("salida.txt", "w")
pat = re.compile("^\s*frecuencia")
output.writelines(line for line in file("entrada.txt") if pat.search(line))
output.close()

Para acceso aleatorio (opuesto al acceso secuencial) de las líneas de ficheros de texto es útil el módulo linecache.

El procesado de texto es un tema amplísimo, si quieres profundizar mírate Text Processing In Python de David Mertz.

¿Qué formas hay de probar con Python de forma interactiva?

IPython es un potentísma shell de Python:

<http://ipython.scipy.org/>

Echa una ojeada también a PyCrust:

<http://sourceforge.net/projects/pycrust/>

¿Cómo documento mi aplicación?

(pendiente)

¿Cómo comparto variables globales entre diferentes módulos?

<http://www.python.org/doc/faq/programming/#what-are-the-rules-for-local-and-global-variables-in-python>

Crea un módulo especial (config, por ejemplo), impórtalo en todos los módulos de tu aplicación que lo usen.

config.py:
    x = 0
 
mod.py:
    import config
    config.x = 1
 
main.py:
    import mod
    import config
    print config.x   # mostrará 1

¿Qué diferencia hay entre los diversas formas de importar módulos? ¿Cuál es la mejor?

Por norma general no hagas "from modulo import *", ensucias el espacio de nombres. Hay algunos módulos que tradicionalmente se han usado así (como Tkinter) pero no hay razón para ello; si, por ejemplo, Tkinter.Button te parece demasiado largo, puedes hacer "import Tkinter as tk" y luego usarlo "tk.Button".

Si vas a usar sólo unas pocas funciones, se aconseja hacer "from module import a, b".

Por norma general, haz "import module" y úsalo con "modulo.xxxxx". Saber qué modulo provee cada función es fundamental para la comprensión de código.

¿Hay alguna forma de encontrar errores en mi programa?

Python es un lenguaje interpretado, así que en principio no es posible detectar más errores que los de sintaxis (que se comprueba al cargar un módulo) y los que generan excepciones en tiempo de ejecución. No hay un proceso de compilación en el que verificar, por ejemplo, que una variable tipo cadena se usa como entero o que una variable que usamos no existe en un espacio de nombres.

Afortunadamente, existen aplicaciones como pychecker, pylint (enfocado más a aspectos formales) o pyflakes que detectan errores comunes mediante una batería de pruebas. No son perfectos, no lo detectan todo y a veces dan falsos positivos, pero son herramientas útiles.

¿Cómo depuro un programa?

Python, en su filosofía de pilas cargadas, lleva un debugger en modo texto en la librería estándar: pdb. Para usarlo, importa el módulo dentro de tu script y llama a pdb.set_trace() cada vez que quieras que el depurador se detenga.

Si el debugger integrado se te queda corto, prueba con pydb. Entre otras cosas, soporta el depurado de threads, gestión de señales e integración en el debugger gráfico DDD.

Si esto sigue sin ser suficiente (lo es para el 99.9% de usuarios), varios IDE libres (Boa Constructor, Eric3) y propietarios (WingIDE, Komodo) incorporan un depurador gráfico.

¡Los acentos no se ven bien!

(pendiente)

¿Qué es ese fichero .pyc que se crea al ejecutar mis scripts?

(pendiente)

¿Cómo importo módulos dinámicamente (a partir de una variable)

s = "sys"
module = __import__(s)
module.stdout.write("hola")

¿Cómo hago para que mi aplicación sea sólida como una roca?

(pendiente)

¿Cuáles son los aspectos básicos que debo saber para trabajar con threads?

(pendiente)

En otros lenguajes usaba "structs", ¿en Python cómo lo hago?

Una forma sencilla sería emplear diccionarios:

estructura = {"campo1": 1, "campo2": 2}  # o estructura = dict(campo1=1, campo2=2)
print estructura["campo1"]

Sin embargo, a muchos programadores les parece poco elegante y propenso a errores el que los campos se accedan como cadenas. Peter Norving en sus Infrequently Asked Questions propone lo siguiente:

class Struct:
    def __init__(self, **entries):
        self.__dict__.update(entries)
 
    def __repr__(self):
        args = ['%s=%s' % (k, repr(v)) for (k,v) in vars(self).items()]
        return 'Struct(%s)' % ', '.join(args)
 
estructura = Struct(campo1=1, campo2=2)
print estructura.campo1

Simple y elegante. Cuando necesitamos acceder a los valores de la estructura de forma conjunta (¡ahora sí querríamos un diccionario!), usa vars, un built-in que devuelve el diccionario de la clase (dict):

for k, v in vars(estructura).iteritems():
    print k, v

¿Cómo empaqueto mi programa para que funcione en *NIX? ¿Y en Windows?

Cada distribución *NIX lleva su propio sistema de paquetes, así que no es necesario incluir Python (sin embargo, es posible empaquetarlos con Pyinstaller si uno se empeña)

En Windows, en cambio, uno no tiene un sistema de dependencias que asegure que Python (y menos alguna versión en concreto) está instalado en la computadora. La solución es empaquetar el programa juntamente con el intérprete y las librerías que uses:

<http://pyinstaller.python-hosting.com>

<http://www.py2exe.org/>

Py2exe era el recurso clásico, pero Pyinstaller está ganando adeptos. Prueba y mira cuál de los dos te funciona mejor.

¿Cómo puedo analizar el tiempo que tarda una determinada función?

(pendiente)

¿Cómo detecto los cuellos de botella de mi aplicación?

(pendiente)

¿Qué quiere decir que Python es multiparadigma?

(pendiente)

¿Es bueno para la programación funcional?

(pendiente)

¿Es bueno para la programación orientada a objetos?

(pendiente)

¿Cómo consigo que una variable o clase sea privada dentro de una clase?

(pendiente)

¿Qué son las metaclases? ¿cómo se implementan?

(pendiente)

He hecho una aplicación y me va muy lenta, ¿qué hago?

<http://www.python.org/doc/faq/programming/#my-program-is-too-slow-how-do-i-speed-it-up>

¿Cómo se copia una lista en Python?

Veamos el siguiente código:

>>> a = [1,2,3]
>>> b = a
>>> b.append(4)
>>> print a, b
[1, 2, 3, 4], [1, 2, 3, 4]

Aunque lo parezca, y como podemos comprobar por el resultado, la segunda línea no ha hecho una copia de a. ¿Por qué un cambio en una lista afecta a la otra? La razón es que Python no tiene lo que técnicamente se entiende por variables (aunque en la práctica las llamemos así), sino nombres (o etiquetas, identificadores, referencias, …). La lista [1,2,3] se le ha llamado a, y seguidamente b, pero esto no crea dos listas, sólo existe una a la que tanto a como b referencian. La copia es un proceso costoso y Python no se embarcará en él a menos que se explicite, haciendo, por ejemplo, un slice que abarque toda la lista (para casos más complejos, ver el módulo copy):

>>> a = [1,2,3]
>>> b = a[:]
>>> b.append(4)
>>> print a, b
[1, 2, 3], [1, 2, 3, 4]

Chema Cortés comenta la cuestión en este hilo:

<http://listas.aditel.org/archivos/python-es/2008-May/020715.html>

Ver también la sección Python has names de la página Idiomatic Python y un interesante enlace que aparece en esta misma página:

<http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html>
<http://www.effbot.org/zone/python-objects.htm>

¿Cómo creo una matriz vacía?

Imaginemos que queremos crear una matriz de tamaño 2x5 con los valores a 0. Un principiante, entusiasmado tras haber descubierto lo que hace el operador * aplicado a listas, seguramente probaría:

>>> matrix = [[0]*5]*2
>>> print matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Parece que va bien, pero la sorpresa viene cuando modificamos alguno de los elementos:

>>> matrix[1][3] = 1
>>> print matrix
[[0, 0, 0, 1, 0], [0, 0, 0, 1, 0]]

Definitivamente no es eso lo que queríamos. La primera vez que hacemos [0]*5 no hay problema, puesto que el valor que repetimos es inmutable (0, un entero); pero a partir de ahí, cualquier repetición estará referida a una lista, que es un objeto mutable, así que lo que estaremos copiando realmente son referencias.

La solución más sencilla es usar comprensión de listas (ojo al orden de los índices):

>>> matrix = [[0 for x in xrange(5)] for y in xrange(2)]
>>> matrix[1][3] = 1
>>> print matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 1, 0]]

Ahora sí. Sin embargo, alguien podría objetar, con razón, que este método no es útil si no conoces previamente la dimensión de la matriz, ni práctico si ésta es grande. Para obtener una matriz de un tamaño arbitrario podemos usar la siguiente función recursiva:

def create_matrix(shape, value=0):
    if not shape:
        return value
    return [create_matrix(shape[1:], value) for _ in xrange(shape[0])]
 
matrix = create_matrix((2, 3, 4))

Esto está bien si vas a hacer operaciones básicas con matrices, en caso contrario puedes utilizar numpy, una potentísima librería matemática cuyo único inconveniente es que, por su tamaño, no forma parte de la librería estándar.

¿Cómo abordar problemas con el unicode?

  1. python puede trabajar "nativamente" con unicode, algo que luego debe codificarse según requiera la salida por la terminal. Por tanto, lo primero es averiguar qué codificación usa la terminal
  2. los ficheros de código pueden haberse codificado en cualquier sistema de codificación. La codificación utf puede usar una marca al principio del fichero para indicarlo, pero algunos editores de texto no saben manejarlas y es mejor no usarlas. Por tanto, lo segundo es indicar con un comentario (primera o segunda línea) en qué sistema de codificación está creado el fichero. Este comentario influye en cómo se lee el fichero fuente de python a excepción de los literales binarios (las cadenas que no son del tipo unicode).
  3. si vamos a leer ficheros de texto que no sean en ascii, se deben abrir con 'codecs.open'

Si seguimos con problemas, probar con éste código (codificado en ascii):

print u"Espa\N{LATIN SMALL LETTER N WITH TILDE}a"

Si da error o no se lee "España" correctamente entonces tu problema NO ES DE PYTHON.

Librerías básicas

¿Cómo leo las opciones por línea de comandos?

Hay dos módulos en la librería estándar:

<http://docs.python.org/lib/module-getopt.html>

<http://docs.python.org/lib/module-optparse.html>

Getopt es una librería se encuentra en muchos otros lenguajes, así que es fácil de usar si ya has trabajado anteriormente con ella. Sin embargo, optparse es muchísimo mejor, más completa, flexible (gestiona los errores, muestra automáticamente el texto de ayuda, etc).

¿Cómo hago para copiar/mover/borrar un fichero?

<http://docs.python.org/lib/module-shutil.html>

¿Cómo trabajo con ficheros binarios?

<http://docs.python.org/lib/module-struct.html>

¿Cómo trabajo con expresiones regulares?

<http://docs.python.org/lib/module-re.html>

<http://www.amk.ca/python/howto/regex/>

¿Qué librerías matemáticas hay disponibles?

<http://docs.python.org/lib/numeric.html>

<http://www.scipy.org/Tentative_NumPy_Tutorial>

<http://matplotlib.sourceforge.net/>

¿Cómo listo los ficheros de un directorio por su nombre?

<http://docs.python.org/lib/module-glob.html>

¿Como recorro un directorio y sus ficheros recursivamente?

Con os.walk: <http://docs.python.org/lib/os-file-dir.html>

¿Cómo ejecuto un programa externo?

Si miras la librería verás muchas formas de hacerlo (os.system, os.spawn, os.popen, popen2, commands), pero desde Python 2.4 se aconseja emplear sólo subprocess:

<http://docs.python.org/lib/module-subprocess.html>

Consulta la documentación para explorar todas las posibilidad (que son muchas). Un caso típico es querer ejecutar un programa, y leer del canal de salida (stdout) y errores (stderr):

import subprocess
command = ["ls", "/etc/services"]
popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outdata, errdata = popen.communicate()
print "codigo de salida del comando:", popen.returncode

A veces simplemente queremos ejecutar un comando y leer su código de salida (como hace os.system). En este caso:

subprocess.call("ls /etc/services", shell=True)

Si necesitas ir leyendo la salida del comando antes de que el proceso finalice, consulta este hilo:

<http://listas.aditel.org/archivos/python-es/2007-October/018821.html>

¿Cómo puedo trabajar con los puertos serie, paralelo y USB?

<http://pyserial.sourceforge.net/>

<http://pyserial.sourceforge.net/pyparallel.html>

(falta USB)

¿Con qué bases de datos puedo trabajar?

(pendiente)

¿Cómo parseo código HTML?

http://docs.python.org/lib/module-HTMLParser.html

http://www.crummy.com/software/BeautifulSoup/

¿Cómo parseo XML?

(pendiente)

¿Cómo trabajo con imágenes?

<http://www.pythonware.com/products/pil/>

<http://www.imagemagick.org/download/python/>

¿Qué librerías existen para crear videojuegos?

Mírate:

<http://wiki.python.org/moin/PythonGameLibraries>

La biblioteca clásica para crear juegos es pygame, un wrapper Python sobre SDL:

<http://www.pygame.org>

Desde hace un tiempo ha surgido una alternativa muy interesante que usa OpenGL:

<http://www.pyglet.org/>

Una librería de más alto nivel para hacer juegos 2D es cocos2d (basado en pyglet):

<http://cocos2d.org/>

¿Cómo creo ficheros PDF?

Solución completa, potente (y compleja):

<http://www.reportlab.com>

Solución simple (pero más limitada):

<http://pybrary.net/pyPdf>

¿Cómo interactúo con programas de oficina (OpenOffice, Microsoft Office, etc)?

(pendiente)

¿Cómo hago un applet ó systray?

(pendiente)

¿Cómo interactúo con SSH?

Con Paramiko:

<http://www.lag.net/paramiko/>

import paramiko
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect("myhots.somewhere.com", username="user", password="xxxxxxxxxx")
 
# Ejecutar comando
stdin, stdout, stderr = sftp.exec_command("ls")
print stdout.readlines()
 
# Leer/escribir fichero remoto (ver también sftp.get/sftp.put)
sftp = c.open_sftp()
data = sftp.open("fichero.txt").read()
data2 = data.replace("a", "z")
sftp.open("fichero.txt",  "w").write(data2)

Mi editor se me ha quedado corto, ¿qué IDE me recomendáis?

Pregunta clásica. Respuesta corta, busca "python ide" en google y prueba todos los que te vayan apareciendo. En otras palabras, el IDE ideal es una cuestión de gustos, lo que a unos les puede maravillar y ayudar en su trabajo, será para otros un IDE intrusivo, pesado e improductivo. Repasa el archivo de la lista, este tema ha salido muchas veces, por ejemplo:

<http://listas.aditel.org/archivos/python-es/2007-August/022984.html>

Programación web

¿Puedo programar CGI?

¡Por supuesto! Puedes consultar la documentación del módulo cgi.

También existe una presentación del propio Guido (en inglés) llamada Python CGI Programming.
Un ejemplo de como quedaría un pequeño cgi en Python (extraido de Writing CGI Programs in Python ):

#!/usr/bin/python
import cgi
print "Content-Type: text/plain\n\n"
Form = cgi.FieldStorage()
for name in Form.keys():
    print "Input: " + name + " value: " + Form[name].value + "<BR>"
print "Finished!"

¿Cuál es el mejor framework web para mi aplicación?

No existe el "mejor framework". El mejor es el que más te guste a ti y el que mejor se adapte a lo que buscas.

Actualmente los Frameworks más populares son (sin ningún orden en contreto):

Lo mejor es que los eches un ojo a todos y evalúes tu mismo cual es el más adecuado para tu proyecto.

Alberto Valverde hace una excelente exposición sobre su experiencia con éstos y otros frameworks (repasa todo el thread, hay otras aportaciones igualmente interesantes):

<http://listas.aditel.org/archivos/python-es/2008-August/022029.html>

¿Cómo programo en AJAX?

Poniéndonos esctrictos es imposible programar AJAX en Python, ya que AJAX significa "Asynchronous JavaScript and XML".

Ahora bien, si lo que quieres es utilizar AJAX en tu proyecto, la mayoría de los frameworks incluyen y soportan de forma más o menos transparente esta técnica.

Interfaces gráficos de usuario (GUI)

¿Qué librerías existen? ¿cuál es la más adecuada?

Una vez más no existe una respuesta para esta pregunta. Hay multitud de bibliotecas de interfaz de usuario disponibles para Python, cada una con sus pros y sus contras. A continuación se citan algunas de las más populares para que juzgues por ti mismo/a.

Tkinter

Tkinter es, históricamente, el standard «de facto» en cuanto a GUI en Python. Permite crear interfaces de usuario en Tcl/Tk desde Python y se jacta de ser la más portable de todas las librerías gráficas disponibles.

Para más información puedes consultar el wiki de Tkinter, la documentación del API, o alguna de las guias de Tkinter disponbles, por ejemplo Tkinter reference: a GUI for Python.

wxPython

wxPython es el wrapper para Python de wxWidgets (anteriormente llamado wxWindows).

La ventaja de wxWidgets sobre otros toolkits multiplataforma es que wxWidgets usa los controles nativos de cada entorno en lugar de emularlos, por lo que les da a las aplicaciones un aspecto totalmente integrado con el resto del sistema.

Para aprender más sobre wxPython puedes leer el manual (en inglés) How to Learn wxPython. También hay disponible abundante documentación sobre wxWidgets.

PyQt

PyQT es una colección de bindings en Python para las librerías gráficas multiplataforma Qt, muy populares por ser las utilizadas (entre otros) por el entorno de escritorio [www.kde.org KDE].

Segun sus desarrolladores, Qt es más que un toolkit GUI. Incluye abtracciones de sockets, threads, Unicode, expresiones regulares, bases de datos SQL, SVG, OpenGL, XML, y una rica colección de controles GUI.

PyQT v4 se distribuye bajo licencia GPL, aunque las versiones anteriores mantienen un sistema de licencias duales (consulta las licencias disponibles antes de decidirte por una u otra versión).

Algunos enlaces interesantes sobre Qt y PyQt:

PyGTK

GTK+ (GIMP Toolkit) se distribuye bajo la licencia LGPL, lo que posibilita el desarrollo de software libre y no libre sin necesidad de pagar licencias o derechos. Aunque está escrita completamente en C, está implementada usando la idea de clases y funciones de retrollamada (callbacks, punteros a función). PyGTK es un wrapper (envoltorio) completo para Python sobre la biblioteca GTK+.

Enlace interesantes:

He hecho una aplicación con PyGTK y cuando llamo a la función todo se para, ¿por qué?

Los GUI funcionan por eventos y para que respondan necesitan que el programa devuelva el control al bucle principal (el del GUI, que en GTK llamamos con gtk.main()). Pero muchas veces necesitamos hacer una operación que lleva tiempo y no queremos que el GUI se quede congelado durante ese intervalo. Para este problema tradicionalmente se habían usado threads:

<http://faq.pygtk.org/index.py?req=show&file=faq20.006.htp>

Pero los threads son complejos, difíciles de depurar, y propensos a errores (fallos de segmentación) inesperados. Afortunadamente, desde la aparición de los generadores en python 2.3, tenemos una forma más sencilla y robusta de diseñar este tipo de problemas. La propuesta que hace el FAQ es:

<http://faq.pygtk.org/index.py?req=show&file=faq23.020.htp>

El ejemplo es para hacer avanzar un Progressbar, pero la idea se puede generalizar (aunque no siempre). Por si acaso, repasa también este hilo de la lista:

<http://listas.aditel.org/archivos/python-es/2007-July/022869.html>

También se ha propuesto usar Twisted con el patrón reactor:

<http://unpythonic.blogspot.com/2007/08/spawning-subprocess-with-pygtk-using.html>

Miscelánea

¿Existe Python para móviles?

Python for S60 es un SDK de Python para la serie 60 de Nokia.

Puedes encontrar más información sobre este tema en el wiki de Nokia. También puedes existe un tutorial de Pys60.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License