Một “gói” về cơ bản là một mô-đun, ngoại trừ nó có thể có các mô-đun khác [và thực tế là các gói khác] bên trong nó
Một gói thường tương ứng với một thư mục có một tệp trong đó có tên là
import sys for p in sys.path: print p9 và bất kỳ số lượng tệp python nào hoặc các thư mục gói khác
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py
import sys for p in sys.path: print p9 có thể hoàn toàn trống rỗng – hoặc nó có thể có mã python tùy ý trong đó
Mã sẽ được chạy khi gói được nhập – giống như một mô-đun,
các mô-đun bên trong các gói không được nhập tự động. Như vậy, với cấu trúc trên
import a_package
sẽ chạy mã trong
from distutils.core import setup1
Bất kỳ tên nào được xác định trong
import sys for p in sys.path: print p9 sẽ có sẵn trong
a_package.a_name
nhưng
a_package.module_a
sẽ không tồn tại. Để có được các mô hình con, bạn cần nhập chúng một cách rõ ràng
from distutils.core import setup3
https. // tài liệu. con trăn. org/3/hướng dẫn/mô-đun. html#gói
Đường dẫn tìm kiếm mô-đun¶
Trình thông dịch giữ một danh sách tất cả các vị trí mà nó tìm kiếm các mô-đun hoặc gói khi bạn thực hiện nhập
import sys for p in sys.path: print p
Bạn có thể thao tác với danh sách đó để thêm hoặc xóa đường dẫn để python tìm các mô-đun ở một vị trí mới
Và mỗi mô-đun có một tên
from distutils.core import setup4 trỏ đến đường dẫn mà nó tồn tại. Điều này cho phép bạn thêm các đường dẫn liên quan đến vị trí của bạn, v.v.
GHI CHÚ. Thay vào đó, tốt hơn là sử dụng chế độ “phát triển” của setuptools – xem bên dưới
Xây dựng gói của riêng bạn¶
Những điều cơ bản về những gì bạn cần biết để tạo gói của riêng bạn
Tại sao phải xây dựng một gói?¶
Có rất nhiều công cụ tiện lợi giúp bạn xây dựng, cài đặt và phân phối các gói
Sử dụng bố cục chuẩn, có cấu trúc tốt cho gói của bạn giúp bạn dễ dàng sử dụng các công cụ đó
Ngay cả khi bạn không bao giờ muốn đưa mã của mình cho bất kỳ ai khác, thì một gói có cấu trúc tốt sẽ giúp đơn giản hóa quá trình phát triển
Gói là gì?¶
Bộ sưu tập các mô-đun
… và tài liệu
… và các bài kiểm tra
… và mọi tập lệnh cấp cao nhất
… và bất kỳ tệp dữ liệu nào được yêu cầu
… và một cách để xây dựng và cài đặt nó…
Công cụ đóng gói Python. ¶
from distutils.core import setup5. bao gồm với trăn
from distutils.core import setup
Trở nên cồng kềnh, khó mở rộng, có thể không được dùng nữa…
from distutils.core import setup6. đối với các tính năng bổ sung, bên thứ ba về mặt kỹ thuật
- có mặt trong hầu hết các bản cài đặt Python hiện đại
“Cơ quan đóng gói Python” – PyPA
https. //www. pypa. io/vi/mới nhất/
công cụ thiết lập¶
from distutils.core import setup6 là phần mở rộng của
from distutils.core import setup5 cung cấp một số phần mở rộng
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py6
siêu bộ của
from distutils.core import setup9
Điều này mua cho bạn một loạt các chức năng bổ sung
- tự động tìm gói
- cài đặt kịch bản tốt hơn
- quản lý tài nguyên [tệp không phải mã]
- chế độ phát triển
- hơn rất nhiều
http. //pythonhosted. org//setuptools/
Tôi phải đi đâu để tìm ra điều này?¶
Đây là một hướng dẫn thực sự tốt
Hướng dẫn sử dụng bao bì Python
https. // bao bì. con trăn. tổ chức/
và một hướng dẫn chi tiết hơn
http. // bao bì trăn. đọcthedocs. io/vi/mới nhất/
Theo dõi một trong số họ
Có một dự án mẫu ở đây
https. //github. com/pypa/sampleproject
[điều này có tất cả sự phức tạp mà bạn có thể cần…]
Bạn có thể sử dụng điều này làm mẫu cho các gói của riêng bạn
Đây là một bản cập nhật có ý kiến - lạ mắt hơn một chút, nhưng một số ý tưởng hay
https. //Blog. ionelmc. ro/2014/05/25/python-packaging/
Cấu trúc gói cơ bản. ¶
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py8
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py60. nhật ký thay đổi với mỗi bản phát hành
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py61. văn bản của giấy phép bạn chọn [hãy chọn một. ]
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py62. mô tả về những tệp không phải mã cần bao gồm
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py63. mô tả gói – phải được viết bằng ReST hoặc Markdown [đối với PyPi]
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py64. tập lệnh để xây dựng/cài đặt gói
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py65. Đây là nơi bạn đặt các tập lệnh cấp cao nhất
[ một số người sử dụng
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py66 ]
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py67. tài liệu
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py68. Gói chính - đây là nơi mã đi
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py69. bài kiểm tra đơn vị của bạn. Tùy chọn ở đây
Đặt nó bên trong gói – hỗ trợ
import sys for p in sys.path: print p9
Hoặc giữ nó ở mức cao nhất
Một số lưu ý về điều đó
` Nơi đặt Bài kiểm tra < http. //pythonchb. github. io/PythonTopics/where_to_put_tests. html>`_
Tệp a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
64¶
Tệp
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py64 của bạn là tệp mô tả gói của bạn và cho công cụ thiết lập biết cách đóng gói, xây dựng và cài đặt gói đó
Đó là mã python, vì vậy bạn có thể thêm bất kỳ tùy chỉnh nào bạn cần vào nó
Nhưng trong trường hợp đơn giản, về cơ bản nó là khai báo
http. // tài liệu. con trăn. org/3/distutils/
a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
64 làm gì?¶
- Phiên bản và gói siêu dữ liệu
- Danh sách các gói bao gồm
- Danh sách các tập tin khác để bao gồm
- Danh sách phụ thuộc
- Danh sách các tiện ích mở rộng sẽ được biên dịch [nếu bạn không sử dụng scikit-build
Một ví dụ a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
64. ¶
import a_package4
a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
84¶
Cung cấp một cách để cung cấp cho người dùng cuối một số khả năng tùy chỉnh cài đặt
Đó là tệp kiểu
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py85
import a_package0
đơn giản để đọc và viết
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py86 là một trong những lệnh Distutils [e. g. build_py, cài đặt]
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py87 là một trong những tùy chọn mà lệnh hỗ trợ
Lưu ý rằng một tùy chọn được đánh vần là
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py88 trên dòng lệnh được đánh vần là
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py89 trong các tệp cấu hình
Đang chạy a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
64¶
Với một tập lệnh
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py64 được xác định, các công cụ thiết lập có thể làm được rất nhiều việc
Xây dựng một bản phân phối nguồn [một kho lưu trữ tar của tất cả các tệp cần thiết để xây dựng và cài đặt gói]
import a_package1
Xây dựng bánh xe
import a_package2
[bạn cần gói bánh xe để làm việc này. ]
import sys for p in sys.path: print p92
Xây dựng từ nguồn
import a_package3
Và cài đặt
import a_package4
Chế độ phát triển¶
Cài đặt ở chế độ “phát triển” hoặc “có thể chỉnh sửa”
import a_package5
hoặc
import a_package6
Đang trong quá trình phát triển¶
Chế độ phát triển thực sự, thực sự tốt
import a_package7
hoặc
import a_package8
[chữ e là viết tắt của "có thể chỉnh sửa" - nó giống nhau]
Nó đặt một liên kết [thực tế là các tệp
import sys for p in sys.path: print p93] vào mã cài đặt python của bạn, để gói của bạn được cài đặt, nhưng mọi thay đổi sẽ có hiệu lực ngay lập tức
Bằng cách này, tất cả mã kiểm tra và mã máy khách, v.v., đều có thể nhập gói của bạn theo cách thông thường
Không hack
import sys for p in sys.path: print p94
Ý tưởng tốt để sử dụng nó cho bất cứ điều gì ngoài một dự án tệp duy nhất
Cài đặtPhát triển Cài đặtSao chép gói vào gói trang webThêm tệpimport sys for p in sys.path: print p95 vào gói trang web, trỏ vào gốc gói nguồnĐược sử dụng khi tạo gói condaĐược sử dụng khi phát triển phần mềm cục bộMức độ ưu tiên bình thường trong hệ thống. pathEnd of
import sys for p in sys.path: print p94 [chỉ tìm thấy nếu không có gì khác đến trước]
https. //grahamwideman. không gian wiki. com/Python-+site-gói+dirs+and+. tập tin pth+
Ngoài pip và các phụ thuộc¶
import sys for p in sys.path: print p
97 hiện chưa có người giải. http. //github. com/pypa/pip/issues/988- pip có thể thay thế các gói trong môi trường của bạn bằng các phiên bản không tương thích. Mọi thứ sẽ tan vỡ khi điều đó xảy ra
- thận trọng [và lý tưởng nhất là môi trường dùng một lần] khi sử dụng pip
Bắt đầu với một gói mới¶
Đối với bất kỳ thứ gì ngoại trừ tập lệnh một tệp [và thậm chí có thể sau đó]
- Tạo cấu trúc gói cơ bản
- Viết một
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py
64 import sys for p in sys.path: print p
99- Đặt một số bài kiểm tra trong
import a_package
40 import a_package
41 trong thư mục thử nghiệm, hoặcimport a_package
42
hoặc sử dụng “Cắt bánh quy”
https. //cắt cookie. đọcthedocs. io/vi/mới nhất/
Tập thể dục. Gói ví dụ nhỏ¶
- Tạo một gói nhỏ
- cấu trúc gói
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py
64import a_package
44import a_package
45
Bắt đầu với mã ngớ ngẩn trong repo hướng dẫn trong
import a_package46
hoặc bạn có thể tải xuống tệp zip tại đây
import a_package47
viết hoa¶
viết hoa là một tiện ích nhỏ vô dụng sẽ viết hoa các từ trong tệp văn bản
Nhưng nó có cấu trúc cốt lõi của gói python
- một thư viện “mã logic”
- một kịch bản dòng lệnh
- một tập tin dữ liệu
- kiểm tra
Vì vậy, hãy xem những gì trong đó
import a_package9
Những tập tin này là gì?¶
import a_package48Mã logic cốt lõi
import a_package49Ứng dụng dòng lệnh
import a_package00Mã thử nghiệm cho logic
import a_package01tập lệnh cấp cao nhất________tệp dữ liệu 302
import a_package03tệp ví dụ mẫu để kiểm tra
dùng thử
a_package.a_name0
Vì vậy, nó hoạt động, miễn là bạn đang ở trong thư mục có tất cả mã
Thiết lập cấu trúc gói¶
Tạo cấu trúc gói cơ bản
a_package.a_name1
Hãy tạo ra tất cả những thứ đó để viết hoa
làm gói
a_package.a_name2
Di chuyển mã vào nó
a_package.a_name3
Tạo một thư mục cho các bài kiểm tra
a_package.a_name4
Di chuyển các bài kiểm tra vào đó
a_package.a_name5
Tạo một thư mục cho tập lệnh
a_package.a_name6
Di chuyển tập lệnh vào đó
a_package.a_name7
Tạo thư mục cho dữ liệu
a_package.a_name8
Di chuyển dữ liệu vào đó
a_package.a_name9
Bây giờ chúng tôi có một gói
Hãy thử nó
a_package.module_a0
OK, cách đó không hiệu quả. Tại sao không?
Vâng, chúng tôi đã di chuyển mọi thứ xung quanh
Các mô-đun không biết cách tìm thấy nhau
Hãy viết một a_package
__init__.py
module_a.py
a_sub_package
__init__.py
module_b.py
64¶
a_package.module_a1
[hãy nhớ rằng một “gói” là một thư mục chứa tệp
import a_package05]
Đó là về mức tối thiểu bạn có thể làm
Lưu nó với tên
a_package __init__.py module_a.py a_sub_package __init__.py module_b.py64 bên ngoài dir gói viết hoa
Cài đặt nó ở chế độ “có thể chỉnh sửa”
a_package.module_a2
dùng thử
a_package.module_a3
Vẫn không hoạt động – tại sao không?
Chúng tôi cần cập nhật một số mục nhập
trong cap_script. py
a_package.module_a4
nên là
a_package.module_a5
và tương tự trong chính. py
a_package.module_a6
Và thử nó
a_package.module_a7
Tập lệnh của chúng tôi không thể tìm thấy tệp dữ liệu. Chúng tôi đã thay đổi vị trí của nó nhưng không thay đổi đường dẫn trong thủ đô_mod. py