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ó

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 p
9 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 p
9 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 setup
1

Bất kỳ tên nào được xác định trong

import sys
for p in sys.path:
    print p
9 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 setup
3

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 setup
4 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 setup
5. 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 setup
6. đố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 setup
6 là phần mở rộng của
from distutils.core import setup
5 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.py
6

siêu bộ của

from distutils.core import setup
9

Đ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.py
8

a_package
   __init__.py
   module_a.py
   a_sub_package
     __init__.py
     module_b.py
60. 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.py
61. 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.py
62. 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.py
63. 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.py
64. 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.py
65. Đâ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.py
66 )

a_package
   __init__.py
   module_a.py
   a_sub_package
     __init__.py
     module_b.py
67. tài liệu

a_package
   __init__.py
   module_a.py
   a_sub_package
     __init__.py
     module_b.py
68. Gói chính - đây là nơi mã đi

a_package
   __init__.py
   module_a.py
   a_sub_package
     __init__.py
     module_b.py
69. 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 p
9

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.py
64 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_package
4

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.py
85

import a_package
0

đơn giản để đọc và viết

a_package
   __init__.py
   module_a.py
   a_sub_package
     __init__.py
     module_b.py
86 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.py
87 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.py
88 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.py
89 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.py
64 đượ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_package
1

Xây dựng bánh xe

import a_package
2

(bạn cần gói bánh xe để làm việc này. )

import sys
for p in sys.path:
    print p
92

Xây dựng từ nguồn

import a_package
3

Và cài đặt

import a_package
4

Chế độ phát triển¶

Cài đặt ở chế độ “phát triển” hoặc “có thể chỉnh sửa”

import a_package
5

hoặc

import a_package
6

Đang trong quá trình phát triển¶

Chế độ phát triển thực sự, thực sự tốt

import a_package
7

hoặc

import a_package
8

(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 p
93) 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 p
94

Ý 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ệp
import sys
for p in sys.path:
    print p
95 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 p
94 (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 đó)

  1. Tạo cấu trúc gói cơ bản
  2. Viết một
    a_package
       __init__.py
       module_a.py
       a_sub_package
         __init__.py
         module_b.py
    
    64
  3. import sys
    for p in sys.path:
        print p
    
    99
  4. Đặt một số bài kiểm tra trong
    import a_package
    
    40
  5. import a_package
    
    41 trong thư mục thử nghiệm, hoặc
    import 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
      
      64
    • import a_package
      
      44
    • import a_package
      
      45

Bắt đầu với mã ngớ ngẩn trong repo hướng dẫn trong

import a_package
46

hoặc bạn có thể tải xuống tệp zip tại đây

import a_package
47

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_package
9

Những tập tin này là gì?¶

import a_package
48Mã logic cốt lõi
import a_package
49Ứng dụng dòng lệnh
import a_package
00Mã thử nghiệm cho logic
import a_package
01tập lệnh cấp cao nhất________tệp dữ liệu 302
import a_package
03tệp ví dụ mẫu để kiểm tra

dùng thử

a_package.a_name
0

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_name
1

Hãy tạo ra tất cả những thứ đó để viết hoa

làm gói

a_package.a_name
2

Di chuyển mã vào nó

a_package.a_name
3

Tạo một thư mục cho các bài kiểm tra

a_package.a_name
4

Di chuyển các bài kiểm tra vào đó

a_package.a_name
5

Tạo một thư mục cho tập lệnh

a_package.a_name
6

Di chuyển tập lệnh vào đó

a_package.a_name
7

Tạo thư mục cho dữ liệu

a_package.a_name
8

Di chuyển dữ liệu vào đó

a_package.a_name
9

Bây giờ chúng tôi có một gói

Hãy thử nó

a_package.module_a
0

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_a
1

(hãy nhớ rằng một “gói” là một thư mục chứa tệp

import a_package
05)

Đó 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.py
64 bên ngoài dir gói viết hoa

Cài đặt nó ở chế độ “có thể chỉnh sửa”

a_package.module_a
2

dùng thử

a_package.module_a
3

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_a
4

nên là

a_package.module_a
5

và tương tự trong chính. py

a_package.module_a
6

Và thử nó

a_package.module_a
7

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