Hướng dẫn create python package with all dependencies - tạo gói python với tất cả các phụ thuộc

Hướng dẫn này hướng dẫn bạn cách đóng gói một dự án Python đơn giản. Nó sẽ chỉ cho bạn cách thêm các tệp và cấu trúc cần thiết để tạo gói, cách xây dựng gói và cách tải nó lên Chỉ mục Gói Python (PYPI).

Mẹo

Nếu bạn gặp khó khăn trong việc chạy các lệnh trong hướng dẫn này, vui lòng sao chép lệnh và đầu ra của nó, sau đó mở một vấn đề trên kho lưu trữ kết quả đóng gói trên GitHub. Chúng tôi sẽ làm hết sức mình để giúp bạn!

Một số lệnh yêu cầu phiên bản PIP mới hơn, vì vậy hãy bắt đầu bằng cách đảm bảo bạn đã cài đặt phiên bản mới nhất:pip, so start by making sure you have the latest version installed:

Unix/macOS

python3 -m pip install --upgrade pip

các cửa sổ

py -m pip install --upgrade pip

Một dự án đơn giản

Hướng dẫn này sử dụng một dự án đơn giản có tên

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
4. Nếu tên người dùng của bạn là
packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
5, thì gói sẽ là
packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
6; Điều này đảm bảo rằng bạn có một tên gói duy nhất không xung đột với các gói được tải lên bởi những người khác theo hướng dẫn này. Chúng tôi khuyên bạn nên làm theo hướng dẫn này là sử dụng dự án này, trước khi đóng gói dự án của riêng bạn.

Tạo cấu trúc tệp sau đây cục bộ:

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py

Thư mục chứa các tệp Python phải khớp với tên dự án. Điều này đơn giản hóa cấu hình và rõ ràng hơn đối với người dùng cài đặt gói.

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
7 được yêu cầu nhập thư mục dưới dạng gói và phải trống.

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
8 là một ví dụ về mô -đun trong gói có thể chứa logic (chức năng, lớp, hằng số, v.v.) của gói của bạn. Mở tệp đó và nhập nội dung sau:

def add_one(number):
    return number + 1

Nếu bạn không quen thuộc với các mô -đun Python và các gói nhập, hãy dành vài phút để đọc tài liệu Python cho các gói và mô -đun.modules and import packages, take a few minutes to read over the Python documentation for packages and modules.

Khi bạn tạo cấu trúc này, bạn sẽ muốn chạy tất cả các lệnh trong hướng dẫn này trong thư mục

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
9.

Tạo các tệp gói

Bây giờ bạn sẽ thêm các tệp được sử dụng để chuẩn bị dự án để phân phối. Khi bạn hoàn thành, cấu trúc dự án sẽ trông như thế này:

packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── example_package_YOUR_USERNAME_HERE/
│       ├── __init__.py
│       └── example.py
└── tests/

Tạo một thư mục kiểm tra

def add_one(number):
    return number + 1
0 là một trình giữ chỗ cho các tập tin kiểm tra. Để nó trống cho bây giờ.

Tạo pyproject.toml¶

def add_one(number):
    return number + 1
1 cho biết các công cụ xây dựng Front Front Frontend như PIP và xây dựng những gì công cụ phụ trợ của Google để sử dụng để tạo các gói phân phối cho dự án của bạn. Bạn có thể chọn từ một số phụ trợ; Hướng dẫn này sử dụng Hatchling theo mặc định, nhưng nó sẽ hoạt động giống hệt với Setuptools, FLIT, PDM và những người khác hỗ trợ bảng
def add_one(number):
    return number + 1
2 cho siêu dữ liệu.pip and build what “backend” tool to use to create distribution packages for your project. You can choose from a number of backends; this tutorial uses Hatchling by default, but it will work identically with setuptools, Flit, PDM, and others that support the
def add_one(number):
    return number + 1
2 table for metadata.

Ghi chú

Một số phụ trợ xây dựng là một phần của các công cụ lớn hơn cung cấp giao diện dòng lệnh với các tính năng bổ sung như khởi tạo dự án và quản lý phiên bản, cũng như xây dựng, tải lên và cài đặt các gói. Hướng dẫn này sử dụng các công cụ đơn mục đích hoạt động độc lập.

Mở

def add_one(number):
    return number + 1
1 và nhập một trong các bảng
def add_one(number):
    return number + 1
4 này:

Truthling

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

setuptools

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

Flit

[build-system]
requires = ["flit_core>=3.2"]
build-backend = "flit_core.buildapi"

PDM

[build-system]
requires = ["pdm-pep517"]
build-backend = "pdm.pep517.api"

  • def add_one(number):
        return number + 1
    
    5 là danh sách các gói cần thiết để xây dựng gói của bạn. Bạn không cần phải cài đặt chúng; Build Frontends như PIP sẽ tự động cài đặt chúng trong môi trường ảo tạm thời, bị cô lập để sử dụng trong quá trình xây dựng.pip will install them automatically in a temporary, isolated virtual environment for use during the build process.

  • def add_one(number):
        return number + 1
    
    6 là tên của đối tượng Python mà Frontends sẽ sử dụng để thực hiện bản dựng.

Cấu hình siêu dữ liệu

Mở

def add_one(number):
    return number + 1
1 và nhập nội dung sau. Thay đổi
def add_one(number):
    return number + 1
8 để bao gồm tên người dùng của bạn; Điều này đảm bảo rằng bạn có một tên gói duy nhất không xung đột với các gói được tải lên bởi những người khác theo hướng dẫn này.

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
  { name="Example Author", email="" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

  • def add_one(number):
        return number + 1
    
    8 là tên phân phối của gói của bạn. Đây có thể là bất kỳ tên nào miễn là nó chỉ chứa các chữ cái, số,
    packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    0,
    packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    1 và
    packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    2. Nó cũng không được thực hiện trên PYPI. Hãy chắc chắn cập nhật điều này với tên người dùng của bạn cho hướng dẫn này, vì điều này đảm bảo bạn đã giành chiến thắng để cố gắng tải lên một gói có cùng tên với tên đã tồn tại.Be sure to update this with your username for this tutorial, as this ensures you won’t try to upload a package with the same name as one which already exists.

  • packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    3 là phiên bản gói. Xem thông số kỹ thuật xác định phiên bản để biết thêm chi tiết về các phiên bản. Một số phụ trợ xây dựng cho phép nó được chỉ định một cách khác, chẳng hạn như từ tệp hoặc thẻ GIT.version specifier specification for more details on versions. Some build backends allow it to be specified another way, such as from a file or a git tag.

  • packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    4 được sử dụng để xác định tác giả của gói; Bạn chỉ định một tên và một email cho mỗi tác giả. Bạn cũng có thể liệt kê
    packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    5 ở cùng định dạng.

  • packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    6 là một bản tóm tắt ngắn gọn, một câu của gói.

  • packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    7 là một đường dẫn đến một tệp chứa một mô tả chi tiết về gói. Điều này được hiển thị trên trang chi tiết gói trên PYPI. Trong trường hợp này, mô tả được tải từ
    packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    8 (là một mẫu phổ biến). Ngoài ra còn có một mẫu bảng nâng cao hơn được mô tả trong đặc tả siêu dữ liệu của dự án.project metadata specification.

  • packaging_tutorial/
    ├── LICENSE
    ├── pyproject.toml
    ├── README.md
    ├── src/
    │   └── example_package_YOUR_USERNAME_HERE/
    │       ├── __init__.py
    │       └── example.py
    └── tests/
    
    9 cung cấp cho các phiên bản Python được hỗ trợ bởi dự án của bạn. Các trình cài đặt như PIP sẽ nhìn lại các phiên bản cũ hơn của các gói cho đến khi nó tìm thấy một phiên bản có phiên bản Python phù hợp.pip will look back through older versions of packages until it finds one that has a matching Python version.

  • [build-system]
    requires = ["hatchling"]
    build-backend = "hatchling.build"
    
    0 cung cấp cho chỉ mục và PIP một số siêu dữ liệu bổ sung về gói của bạn. Trong trường hợp này, gói chỉ tương thích với Python 3, được cấp phép theo giấy phép MIT và độc lập với hệ điều hành. Bạn phải luôn luôn bao gồm ít nhất (các) phiên bản Python của bạn hoạt động trên đó, giấy phép mà gói của bạn có sẵn và hệ điều hành mà gói hàng của bạn sẽ hoạt động. Để biết danh sách đầy đủ các trình phân loại, xem https://pypi.org/ classifier/.pip some additional metadata about your package. In this case, the package is only compatible with Python 3, is licensed under the MIT license, and is OS-independent. You should always include at least which version(s) of Python your package works on, which license your package is available under, and which operating systems your package will work on. For a complete list of classifiers, see https://pypi.org/classifiers/.

  • [build-system]
    requires = ["hatchling"]
    build-backend = "hatchling.build"
    
    1 cho phép bạn liệt kê bất kỳ số lượng liên kết bổ sung nào để hiển thị trên PYPI. Nói chung, điều này có thể là nguồn, tài liệu, trình theo dõi phát hành, v.v.

Xem thông số kỹ thuật siêu dữ liệu của dự án để biết chi tiết về các trường này và các trường khác có thể được xác định trong bảng

def add_one(number):
    return number + 1
2. Các trường phổ biến khác là
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
3 để cải thiện khả năng khám phá và
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
4 được yêu cầu để cài đặt gói của bạn.project metadata specification for details on these and other fields that can be defined in the
def add_one(number):
    return number + 1
2 table. Other common fields are
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
3 to improve discoverability and the
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
4 that are required to install your package.

Tạo readme.md¶

Mở

packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── example_package_YOUR_USERNAME_HERE/
│       ├── __init__.py
│       └── example.py
└── tests/
8 và nhập nội dung sau. Bạn có thể tùy chỉnh điều này nếu bạn thích.

py -m pip install --upgrade pip
0

Tạo giấy phép lor

Nó rất quan trọng cho mỗi gói được tải lên chỉ mục gói Python để bao gồm giấy phép. Điều này cho người dùng cài đặt gói của bạn các điều khoản mà họ có thể sử dụng gói của bạn. Để được trợ giúp chọn giấy phép, hãy xem https://choosealicense.com/. Khi bạn đã chọn giấy phép, hãy mở

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
6 và nhập văn bản giấy phép. Ví dụ: nếu bạn đã chọn giấy phép MIT:

py -m pip install --upgrade pip
1

Hầu hết các phụ trợ xây dựng tự động bao gồm các tệp giấy phép trong các gói. Xem tài liệu phụ trợ của bạn để biết thêm chi tiết.

Bao gồm các tập tin khác

Các tệp được liệt kê ở trên sẽ được bao gồm tự động trong phân phối nguồn của bạn. Nếu bạn muốn bao gồm các tệp bổ sung, hãy xem tài liệu cho phụ trợ xây dựng của bạn.source distribution. If you want to include additional files, see the documentation for your build backend.

Tạo tài liệu lưu trữ phân phối

Bước tiếp theo là tạo các gói phân phối cho gói. Đây là những tài liệu lưu trữ được tải lên chỉ mục gói Python và có thể được cài đặt bởi PIP.distribution packages for the package. These are archives that are uploaded to the Python Package Index and can be installed by pip.

Đảm bảo bạn đã cài đặt phiên bản mới nhất của Pypa, bản dựng:build installed:

Unix/macOS

py -m pip install --upgrade pip
2

các cửa sổ

py -m pip install --upgrade pip
3

Bây giờ hãy chạy lệnh này từ cùng một thư mục nơi

def add_one(number):
    return number + 1
1 được đặt:

Lệnh này sẽ xuất ra rất nhiều văn bản và sau khi hoàn thành sẽ tạo hai tệp trong thư mục

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
8:

py -m pip install --upgrade pip
4

Tệp

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
9 là một phân phối nguồn trong khi tệp
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
0 là phân phối được xây dựng. Các phiên bản PIP mới hơn ưu tiên cài đặt các phân phối được xây dựng, nhưng sẽ quay trở lại phân phối nguồn nếu cần. Bạn nên luôn luôn tải lên một phân phối nguồn và cung cấp các bản phân phối được xây dựng cho các nền tảng mà dự án của bạn tương thích. Trong trường hợp này, gói ví dụ của chúng tôi tương thích với Python trên bất kỳ nền tảng nào, vì vậy chỉ cần một phân phối được xây dựng.source distribution whereas the
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
0 file is a built distribution. Newer pip versions preferentially install built distributions, but will fall back to source distributions if needed. You should always upload a source distribution and provide built distributions for the platforms your project is compatible with. In this case, our example package is compatible with Python on any platform so only one built distribution is needed.

Tải lên Lưu trữ phân phối

Cuối cùng, đó là thời gian để tải gói của bạn lên chỉ mục gói Python!

Điều đầu tiên bạn cần làm là đăng ký một tài khoản trên TestPyPi, đây là một ví dụ riêng biệt của chỉ mục gói dự định để thử nghiệm và thử nghiệm. Nó rất tuyệt cho những thứ như hướng dẫn này, nơi chúng tôi không nhất thiết muốn tải lên chỉ mục thực. Để đăng ký một tài khoản, hãy truy cập https://test.pypi.org/account/register/ và hoàn thành các bước trên trang đó. Bạn cũng sẽ cần xác minh địa chỉ email của mình trước khi bạn có thể tải lên bất kỳ gói nào. Để biết thêm chi tiết, xem bằng cách sử dụng TestPypi.Using TestPyPI.

Để tải lên một cách an toàn dự án của bạn, bạn sẽ cần một mã thông báo API PYPI. Tạo một cái tại https://test.pypi.org/manage/account/#api-tokens, đặt phạm vi phạm vi trên toàn bộ tài khoản. Don Tiết đóng trang cho đến khi bạn đã sao chép và lưu mã thông báo - bạn đã giành được mã thông báo đó một lần nữa.Don’t close the page until you have copied and saved the token — you won’t see that token again.

Bây giờ bạn đã đăng ký, bạn có thể sử dụng Twine để tải lên các gói phân phối. Bạn cần phải cài đặt Twine:twine to upload the distribution packages. You’ll need to install Twine:

Unix/macOS

py -m pip install --upgrade pip
5

các cửa sổ

py -m pip install --upgrade pip
6

Bây giờ hãy chạy lệnh này từ cùng một thư mục nơi

def add_one(number):
    return number + 1
1 được đặt:

Unix/macOS

py -m pip install --upgrade pip
7

các cửa sổ

py -m pip install --upgrade pip
8

Bây giờ hãy chạy lệnh này từ cùng một thư mục nơi

def add_one(number):
    return number + 1
1 được đặt:

Lệnh này sẽ xuất ra rất nhiều văn bản và sau khi hoàn thành sẽ tạo hai tệp trong thư mục

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
8:

py -m pip install --upgrade pip
9

Tệp

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
9 là một phân phối nguồn trong khi tệp
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
0 là phân phối được xây dựng. Các phiên bản PIP mới hơn ưu tiên cài đặt các phân phối được xây dựng, nhưng sẽ quay trở lại phân phối nguồn nếu cần. Bạn nên luôn luôn tải lên một phân phối nguồn và cung cấp các bản phân phối được xây dựng cho các nền tảng mà dự án của bạn tương thích. Trong trường hợp này, gói ví dụ của chúng tôi tương thích với Python trên bất kỳ nền tảng nào, vì vậy chỉ cần một phân phối được xây dựng.

Tải lên Lưu trữ phân phối

Cuối cùng, đó là thời gian để tải gói của bạn lên chỉ mục gói Python!pip to install your package and verify that it works. Create a virtual environment and install your package from TestPyPI:

Unix/macOS

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
0

các cửa sổ

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
1

Bây giờ hãy chạy lệnh này từ cùng một thư mục nơi

def add_one(number):
    return number + 1
1 được đặt:

Lệnh này sẽ xuất ra rất nhiều văn bản và sau khi hoàn thành sẽ tạo hai tệp trong thư mục

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
8:

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
2

Tệp

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
9 là một phân phối nguồn trong khi tệp
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
0 là phân phối được xây dựng. Các phiên bản PIP mới hơn ưu tiên cài đặt các phân phối được xây dựng, nhưng sẽ quay trở lại phân phối nguồn nếu cần. Bạn nên luôn luôn tải lên một phân phối nguồn và cung cấp các bản phân phối được xây dựng cho các nền tảng mà dự án của bạn tương thích. Trong trường hợp này, gói ví dụ của chúng tôi tương thích với Python trên bất kỳ nền tảng nào, vì vậy chỉ cần một phân phối được xây dựng.

Tải lên Lưu trữ phân phối

Bạn có thể kiểm tra rằng nó đã được cài đặt chính xác bằng cách nhập gói. Hãy chắc chắn rằng bạn vẫn còn trong môi trường ảo của mình, sau đó chạy Python:

và nhập gói:

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py
3

Bước tiếp theo¶

Xin chúc mừng, bạn đã đóng gói và phân phối một dự án Python! ✨ 🍰 ✨ 🍰 ✨

Hãy nhớ rằng hướng dẫn này đã chỉ cho bạn cách tải lên gói của bạn để kiểm tra PYPI, đây là một bộ lưu trữ vĩnh viễn. Hệ thống thử nghiệm thỉnh thoảng xóa các gói và tài khoản. Tốt nhất là sử dụng TestPypi để thử nghiệm và thử nghiệm như hướng dẫn này.

Khi bạn đã sẵn sàng để tải lên một gói thực sự lên chỉ mục gói Python, bạn có thể làm nhiều như bạn đã làm trong hướng dẫn này, nhưng với những khác biệt quan trọng này:

  • Chọn một tên đáng nhớ và độc đáo cho gói của bạn. Bạn không cần phải nối lại tên người dùng của mình như bạn đã làm trong hướng dẫn, nhưng bạn có thể sử dụng một tên hiện có.

  • Đăng ký một tài khoản trên https://pypi.org - Lưu ý rằng đây là hai máy chủ riêng biệt và chi tiết đăng nhập từ máy chủ thử nghiệm không được chia sẻ với máy chủ chính.

  • Sử dụng

    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    7 để tải lên gói hàng của bạn và nhập thông tin đăng nhập của bạn cho tài khoản bạn đã đăng ký trên PYPI thực. Bây giờ bạn đã tải lên gói trong sản xuất, bạn không cần phải chỉ định
    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    8; Gói sẽ tải lên https://pypi.org/ theo mặc định.

  • Cài đặt gói của bạn từ PYPI thực sự bằng

    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    9.

Tại thời điểm này nếu bạn muốn đọc thêm về các thư viện Python đóng gói thì đây là một số điều bạn có thể làm:

  • Xem xét các công cụ đóng gói cung cấp một giao diện dòng lệnh duy nhất để quản lý và đóng gói dự án, chẳng hạn như hatch, flit, pdm và thơ.hatch, flit, pdm, and poetry.

  • Đọc PEP 517 và PEP 518 để biết nền và chi tiết về cấu hình công cụ xây dựng.PEP 517 and PEP 518 for background and details on build tool configuration.

  • Đọc về bao bì mở rộng nhị phân.Packaging binary extensions.