2010-10-29 21 views
23

¿Hay una manera de permitir un paquete para ser ejecutado como un guión? Por ejemplo:ejecutar un paquete Python instalado como un guión?

[~]# easy_install /path/to/foo.egg 
... 
[~]# python -m foo --name World 
Hello World 

He intentado crear un archivo __main__.py dentro de mi paquete, pero no está siendo ejecutado (estoy usando Python 2.6). se eleva el siguiente error:

foo is a package and cannot be directly executed 

la estructura de mi paquete es la siguiente:

foo/ 
    setup.py 
    foo/ 
    __init__.py 
    __main__.py 

Correr python -m foo.__main__ --name World funciona como se esperaba, pero yo preferiría que el antiguo modo de ejecución. es posible?

+0

https://stackoverflow.com/questions/6630822/running-a-python-package – n611x007

+0

enlace útil: https://www.reddit.com/r/Python/comments/2gki9e/python_apps_the_right_way_entry_points_and_scripts/ –

Respuesta

-3

, siempre y cuando el paquete está en el camino pitón, añadir al final de la secuencia de comandos.

if __name__ == "__main__": 
    call_script() 
$ python -m module_name

se ejecutará el módulo por ejemplo

 
python -m random 
+5

Esto no lo hace trabajar para paquetes. El OP conoce el modificador '-m' para los módulos. –

4

Creo que esto puede ser una limitación de Python 2.6. Lo he probado, y la ejecución de un paquete (ya sea en . o instalado de un huevo con easy_install) con la opción -m funciona bien en 2.7, pero no en 2.6. Por ejemplo, en mi sistema (Ubuntu) con un paquete de prueba llamada pkg_exec en el directorio actual, y donde __main__.py simplemente imprime sys.argv:

[email protected]:~/tmp/pkg_exec$ python2.6 -m pkg_exec 
/usr/bin/python2.6: pkg_exec is a package and cannot be directly executed 
[email protected]:~/tmp/pkg_exec$ python2.7 -m pkg_exec 
['/home/xx/tmp/pkg_exec/pkg_exec/__main__.py'] 

Además, según the 2.7 docs:

cambiado en la versión 2.7 : Proporcione el nombre del paquete para ejecutar un submódulo __main__.

26

Esto es una regresión en Python 2.6. Ver issue2571:

La capacidad de ejecutar paquetes nunca fue la intención, ya que al hacerlo rompe las importaciones en una variedad de maneras sutiles. En realidad, fue un error en 2.5 que se permite en absoluto, por lo que 2.6 no sólo desactivado de nuevo, pero también agregó una prueba para asegurarse de que permanece desactivado (2.4 correctamente lo rechazaron con un ImportError, al igual que 2.6 hace).

Usted tiene algunas opciones, puede ejecutar siempre que especifica principal:

$ python -m module.__main__ 

O puede escribir un envoltorio shell script que detecta la versión de Python y luego lo ejecuta en el estilo diferente.

O puede ejecutar código en la línea de comandos que va a importar y haga funcionar el módulo, y entonces tal vez el lugar que en un script de shell:

$ python -c "import module; module.main()" 

En mis propios proyectos de línea de comandos que tengo tanto la script de shell que detecta errores (Python no se instala, etc.) pero el script de shell también ejecutará el código de importación y detectará si los módulos necesarios han sido instalados y provocará un error (con un enlace útil o texto de instalación).

Cuestiones relacionadas