Bao bì trăn hiện đại
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ó Show
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ơ 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
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ì?¶
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¶
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 đó)
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ỏ¶
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
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 |