Khởi chạy mô-đun bên trong gói vì thực thi là thực tiễn không tốt.
Khi bạn phát triển thứ gì đó, bạn xây dựng một thư viện, được dự định nhập bởi các chương trình khác và do đó bạn không nên thực hiện trực tiếp các mô-đun con, hoặc bạn xây dựng một tệp thực thi. để biến nó thành một phần của gói.
Đây là lý do tại sao trong số setup.py
bạn phân biệt giữa các gói và tập lệnh. Các gói sẽ đi theo site-packages
trong khi các tập lệnh sẽ được cài đặt theo /usr/bin
(hoặc vị trí tương tự tùy thuộc vào hệ điều hành).
Tôi đề nghị là nên sử dụng cách bố trí như sau:
/
├── mydirectory
| ├── __init__.py
| ├── file1.py
└── file2.py
đâu file2.py
nhập khẩu file1.py
như bất kỳ mã khác mà muốn sử dụng thư viện mydirectory
, với tuyệt đối nhập khẩu:
from mydirectory.file1 import f
Khi bạn viết kịch bản setup.py
cho dự án, bạn chỉ cần liệt kê mydirectory
làm gói và file2.py
như một kịch bản và mọi thứ sẽ hoạt động. Không cần phải fiddle với sys.path
.
Nếu bạn đã bao giờ, đối với một số lý do, thực sự muốn thực sự chạy một submodule của một gói, cách thích hợp để làm điều đó là sử dụng -m
switch:
python -m mydirectory.file1
này tải toàn bộ gói và sau đó thực thi mô-đun dưới dạng tập lệnh, cho phép nhập tương đối thành công.
Tôi muốn tránh việc này. Cũng bởi vì rất nhiều người thậm chí không biết bạn có thể làm điều này và sẽ kết thúc nhận được cùng một lỗi như bạn và nghĩ rằng gói bị hỏng.
Về câu trả lời chấp nhận hiện nay, trong đó nói rằng bạn chỉ nên sử dụng một khẩu ngầm tương from file1 import f
vì nó sẽ làm việc kể từ khi họ đang ở trong cùng thư mục:
Đây là sai!
- Nó sẽ không làm việc trong python3 nơi nhập khẩu tương đối ngầm là không được phép và chắc chắn sẽ phá vỡ nếu bạn tình cờ đã cài đặt một module
file1
(vì nó sẽ được nhập khẩu thay vì mô-đun của bạn!).
Ngay cả khi nó hoạt động file1
sẽ không được xem như là một phần của gói mydirectory
. Điều này có thể vấn đề.
Ví dụ: nếu file1
sử dụng pickle
, tên của gói là quan trọng để tải/dỡ dữ liệu phù hợp.
Bạn có đang chạy 'file2.py' trực tiếp không? – Blender
vâng tôi đang làm: 'python3 file2.py' từ dòng lệnh –
Nếu một mô-đun python là một phần của một gói bạn * không nên * khởi động nó như là chính. Nếu bạn phân phối thư viện của bạn, các gói sẽ đi vào 'site-packages' nhưng các script nên đi tới'/usr/bin' hoặc một cái gì đó tương tự (do đó cần nhập khẩu tuyệt đối). Nên có một sự phân biệt rõ ràng giữa một mô-đun python được viết để được thực thi và một mô-đun được viết thành một phần của một thư viện. – Bakuriu