Tôi đang viết một họ các kịch bản Python trong một dự án; mỗi tập lệnh nằm trong thư mục con của dự án, như vậy:Python: chia sẻ mã chung giữa một nhóm các kịch bản
projectroot
|
|- subproject1
| |
| |- script1.main.py
| `- script1.merger.py
|
|- subproject2
| |
| |- script2.main.py
| |- script2.matcher.py
| `- script2.merger.py
|
`- subproject3
|
|- script3.main.py
|- script3.converter.py
|- script3.matcher.py
`- script3.merger.py
Bây giờ, một số tập lệnh chia sẻ một số mã. Mã chia sẻ tốt nhất được coi là một phần của bản thân dự án, chứ không phải là một cái gì đó tôi sẽ biên dịch một cách riêng biệt và tạo ra một thư viện, hoặc thả vào một PYTHONPATH trên toàn trang web. Tôi có thể đặt mã đó ở những nơi khác nhau, chẳng hạn như trong thư mục projectroot
, hoặc trong một thư mục con của projectroot
được gọi là common
(có thể). Tuy nhiên, hầu hết các cách tôi đã nghĩ đến cho đến nay liên quan đến việc thực hiện các gói trong các tiểu dự án của tôi với các tệp rỗng __init__.py
và sử dụng nhập khẩu tương đối (hoặc lộn xộn với sys.path
trong mỗi tiểu dự án. xung quanh gia đình này các script chạy afoul của cảnh báo sau đây từ từ chối PEP-3122:
Attention! This PEP has been rejected. Guido views running scripts within a package as an anti-pattern.
Nếu kịch bản trong vòng một gói là chống patternish, làm thế nào tôi có thể thiết lập những điều theo một cách mà giữ các mã thông thường trong cùng một Hoặc là một mô-đun và gói dựa trên hệ thống chấp nhận được ở đây? Đó là cách tiếp cận sạch nhất? (FWIW tôi muốn t o có một tệp chẳng hạn như shared.py
hoặc common.py
trong thư mục gốc của dự án, thay vì tạo thư mục tiện ích là anh chị em cho các tiểu dự án "thực".)
tôi tin rằng django sử dụng một điểm vào tập trung 'manage.py' để chạy tất cả các tập lệnh của nó. Làm một cái gì đó như thế này có thể cho phép bạn biến 'subprojectX' thành các gói và xử lý việc nhập tập trung bên trong tập lệnh" 'manage.py'" (điểm vào). Như các gói, tôi tin rằng, nó sẽ dễ dàng hỗ trợ một mô-đun 'phổ biến', nơi chức năng chia sẻ của bạn có thể hoạt động. – dm03514
Tôi tin rằng phải là [PEP-3122] (https://www.python.org/dev/peps/pep-3122/), không phải PEP-32122. – user1071847