2011-07-08 24 views
17

Al ejecutar Python 2.6.1 en OSX, se implementará en CentOS. Me gustaría tener un paquete para ser invocado desde una línea de comandos así:Ejecutando un paquete python

python [-m] tst 

Por eso, aquí es la estructura de directorio fabricados:

$PYTHONPATH/ 
    tst/ 
     __init__.py  # empty 
     __main__.py  # below 
     dep.py   # below 

La siguiente es en los archivos:

$ cat tst/__main__.py 
from .dep import DepClass 

print "Hello there" 

$ cat tst/dep.py 
class DepClass(object): 
    pass 

$ 

Sin embargo, pitón me da conflicto de diagnóstico:

$ python -m tst 
/usr/bin/python: tst is a package and cannot be directly executed 

OK, por lo que se reconoce como un paquete. ¿Entonces debería poder ejecutarlo como un script? Tiene __main__ ...

$ python tst 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/runpy.py", line 121, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/runpy.py", line 34, in _run_code 
    exec code in run_globals 
    File "/Users/vdidenko/Code/emi/tst/__main__.py", line 1, in <module> 
    from .dep import DepClass 
ValueError: Attempted relative import in non-package 

En este punto, estoy perdido. ¿Por qué non-package? ¿Y cómo estructurar el código entonces?

+1

No es un dup, las diferentes respuestas cuando se ejecuta con [-m], solución diferente. Aunque suena cerca. Este problema no pudo agregar '.__ main__' cuando se estaba ejecutando, el otro sí lo agregó correctamente. –

Respuesta

28

La característica para ejecutar el módulo __main__ de un paquete al utilizar la opción de línea de comando -m se introdujo en Python 2.7. Para 2.6, debe especificar el nombre del módulo del paquete para ejecutar; -m test.__main__ debería funcionar. Consulte la documentación here.

+1

¡Genial, gracias! Los documentos en 2.6x eran un poco vagos y confusos entre las diferentes versiones no ayudaron. –

+0

//, Esto también es un problema con declaraciones como 'python -m pip install argparse' y similares. –

Cuestiones relacionadas