2011-07-08 21 views
17

OSX'de Python 2.6.1'in çalıştırılması, CentOS'a dağıtılacaktır. Bir paket sahip olmak ister misiniz böyle bir komut satırından çağırılacak:Python paketinin çalıştırılması

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

şudur dosyalardaki:

Bunun için

python [-m] tst 

, burada yapılan dizin yapısı Ancak

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

print "Hello there" 

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

$ 

, piton beni teşhis çelişkili verir:

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

Tamam, bu nedenle paket olarak tanınır. Yani bir senaryo olarak çalıştırabilmeliyim? Ben kayboldum Bu noktada ...

$ 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 

__main__ sahiptir. Neden non-package? Ve kodu nasıl yapılandırmalı?

+1

[-m] ile çalışırken farklı yanıtlar değil, farklı bir çözüm. Her ne kadar yakın olsa da. Bu sorun çalıştırırken '.__ main__' eklenemedi, diğeri düzgün ekledi. –

cevap

28

-m komut satırını kullanırken bir paketin __main__ modülünü çalıştırma özelliği, Python 2.7'de eklendi. 2.6 için çalıştırmak için paket modül adını belirtmeniz gerekir; -m test.__main__ çalışmalıdır. here belgelerine bakın.

+1

Harika, teşekkürler! 2.6x'teki dokümanlar biraz belirsizdi ve farklı versiyonlar arasında kafa karıştırıcı işe yaramadı. –

+0

//, Bu aynı zamanda python -m pip install argparse ve benzeri gibi ifadelerle de bir sorundur. –