2011-07-08 22 views
17

Chạy Python 2.6.1 trên OSX, sẽ triển khai tới CentOS. Muốn có một gói để được gọi từ một dòng lệnh như thế này:Chạy gói python

python [-m] tst 

Cho rằng, đây là cấu trúc thư mục thực hiện:

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

Sau đây là trong các tập tin:

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

print "Hello there" 

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

$ 

Tuy nhiên, trăn mang lại cho tôi mâu thuẫn chẩn đoán:

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

OK, vì vậy nó được công nhận là một gói. Vì vậy, tôi sẽ có thể chạy nó như là một kịch bản? Nó có __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 

Tại thời điểm này tôi bị mất. Tại sao lại là non-package? Và làm thế nào để cấu trúc mã sau đó?

+1

Không phải là quảng cáo, phản ứng khác nhau khi chạy với [-m], giải pháp khác nhau. Mặc dù âm thanh gần. Sự cố này không thể thêm '.__ main__' khi đang chạy, sự cố khác đã thêm nó đúng cách. –

Trả lời

28

Tính năng chạy mô-đun __main__ của gói khi sử dụng tùy chọn dòng -m được giới thiệu trong Python 2.7. Đối với phiên bản 2.6, bạn cần chỉ định tên mô-đun gói để chạy; -m test.__main__ sẽ hoạt động. Xem tài liệu here.

+1

Tuyệt vời, cảm ơn bạn! Các tài liệu trong 2.6x là kinda mơ hồ và khó hiểu giữa các phiên bản khác nhau đã không giúp đỡ. –

+0

//, Đây cũng là một vấn đề với các câu lệnh như 'python -m pip install argparse' và tương tự. –