Jun 6, 2014

Python guion m

Acabo de llevarme una grata sorpresa una vez más con Python y sus baterías incluidas.

Me vengo enterando de además del servidor HTTP que siempre he conocido que viene con Python ¡nunca había puesto atención a su versión CGI! Lo que me recordó acerca de escribir un post sobre por que se usa __main__ y como ejecutar los módulos con la opción -m.

Resulta que cuando ejecutas python de esta forma:

python -m LeModule

De forma automática python tratará de:

  • Buscar un módulo con nombre LeModule.
  • En caso de que sea un módulo sobre un archivo (no un paquete) ejecuta su contenido directamente.
  • En caso de que sea un paquete (directorio con __init__.py) busca un archivo con el nombre de __main__.py al cual ejecuta.

La búsqueda de el mencionado módulo se hace sobre el PYTHONPATH, el cual usualmente se define como una variable de entorno o se puede modifica en tiempo de ejecución a través del módulo sys. Para esto simplemente agregando a sys.path el nuevo directorio que queremos que considere para descubrir nuestro módulo. En caso de que estés usando virtualenv no tiene sentido modificar sys.path.

Por cierto el tan molesto if __name__ == '__main__' dentro de un módulo se debe a que se quiere evitar la ejecución de código cuando lo que se búsca es solamente es importar sus definiciones. En el caso de lo que mencionó aquí es la funcionalidad dentro de esé if o en el módulo __main__ de el paquete al que se refierá.

Las baterías incluidas

Volviendo al tema de los módulos ejecutables que ya vienen en python este es un compendio de los que considero interesantes/funcionales hasta cierto punto:

  • base64
  • calendar
  • CGIHTTPServer
  • compileall
  • cProfile
  • dis
  • filecmp
  • ftplib
  • gzip
  • json.tool
  • locale
  • mimetypes
  • netrc
  • pdb
  • platform
  • profile
  • pstats
  • pyclbr
  • pydoc
  • quopri
  • SimpleHTTPServer
  • site
  • smtpd
  • sysconfig
  • tabnanny
  • telnetlib
  • this
  • tokenize
  • trace
  • uu
  • webbrowser
  • zipfile

Python 3 unifica los módulos CGIHTTPServer y SimpleHTTPServer a través de http.server:

CGIHTTPServer == http.server --cgi

SimpleHTTPServer == http.server

El que hace cada módulo se los dejo para que lo experimenten. Si están aburridos prueben con -m turtle.

Cabe destacar que varios de estos están diseñados para probar el módulo en sí, donde como efecto secundario ofrecen algo útil para ser usaro desde la linea de comandos.

¿Conoces algún otro módulo útil que no tomé en cuenta? Soy todo ojos.

Tags: python