2010-10-29 40 views
23

Có cách nào để cho phép một gói được thực thi dưới dạng tập lệnh không? Ví dụ:Thực thi gói Python đã cài đặt dưới dạng tập lệnh?

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

Tôi đã thử tạo tệp __main__.py bên trong gói của mình nhưng không được thực thi (Tôi đang sử dụng Python 2.6). Các lỗi sau đây được nâng lên:

foo is a package and cannot be directly executed 

Cơ cấu của gói của tôi là như sau:

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

Chạy python -m foo.__main__ --name World công trình như mong đợi, nhưng tôi sẽ thích cách cựu thực hiện. Điều này có thể không?

+0

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

+0

liên kết hữu ích: https://www.reddit.com/r/Python/comments/2gki9e/python_apps_the_right_way_entry_points_and_scripts/ –

Trả lời

-3

miễn là gói nằm trên đường dẫn trăn, thêm vào cuối tập lệnh.

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

sẽ chạy module ví dụ

 
python -m random 
+5

này không làm việc cho các gói. OP biết về chuyển đổi '-m' cho các mô-đun. –

4

Tôi nghĩ rằng đây có thể là một hạn chế của Python 2.6. Tôi đã thử nghiệm nó, và thực hiện một gói (hoặc trong . hoặc cài đặt từ một quả trứng với easy_install) với các tùy chọn -m hoạt động tốt trong 2,7, nhưng không phải trong 2,6. Ví dụ, trên hệ thống của tôi (Ubuntu) với một gói phần mềm thử nghiệm gọi là pkg_exec trong thư mục hiện hành, và ở đâu __main__.py chỉ đơn giản in 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'] 

Ngoài ra, theo the 2.7 docs:

Thay đổi trong phiên bản 2.7 : Cung cấp tên gói để chạy mô-đun phụ __main__.

26

Đây là hồi quy trong Python 2.6. Xem issue2571:

Khả năng thực thi gói không bao giờ được dự định, vì làm như vậy ngắt nhập bằng nhiều cách tinh tế. Nó thực sự là một lỗi trong 2.5 rằng nó đã được cho phép, vì vậy 2.6 không chỉ vô hiệu hóa nó nữa mà còn thêm một thử nghiệm để đảm bảo nó bị vô hiệu hóa (2.4 chính xác từ chối nó với một ImportError, cũng giống như 2.6).

Bạn có một vài tùy chọn, bạn có hai luôn chạy nó xác định chính:

$ python -m module.__main__ 

Hoặc bạn có thể viết một kịch bản wrapper vỏ có khả năng dò phiên bản python và sau đó thực hiện nó theo phong cách khác nhau.

Hoặc bạn có thể thực thi mã trên dòng lệnh đó sẽ nhập khẩu và sau đó chạy mô-đun, và sau đó có lẽ đặt rằng trong một kịch bản shell:

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

Trong các dự án dòng lệnh riêng của tôi, tôi có cả hai shell script bắt lỗi (python không được cài đặt, v.v.) nhưng kịch bản lệnh shell cũng sẽ thực thi mã nhập và phát hiện xem các mô-đun cần thiết đã được cài đặt hay chưa và nhắc một lỗi (với một liên kết hữu ích hoặc cài đặt văn bản).

Các vấn đề liên quan