>  기사  >  백엔드 개발  >  나만의 Python 패키지 만들기

나만의 Python 패키지 만들기

WBOY
WBOY원래의
2023-09-02 19:53:141540검색

创建您自己的 Python 包

Python은 훌륭한 프로그래밍 언어이며 그 이상입니다. 그러나 가장 약한 점 중 하나는 포장입니다. 이는 사회에서도 널리 알려진 사실이다. 패키지 설치, 가져오기, 사용 및 생성은 수년에 걸쳐 개선되었지만 여전히 Python 및 기타 성숙한 언어의 어려움에서 많은 것을 배울 수 있는 Go 및 Rust와 같은 새로운 언어와 비교할 수 없습니다.

이 튜토리얼에서는 자신만의 패키지를 구축하고 공유하는 데 필요한 모든 것을 배우게 됩니다. Python 패키지에 대한 일반적인 배경 정보는 Python 패키지 사용 방법을 읽어보세요.

포장 프로젝트

프로젝트 패키징은 일관된 Python 모듈 세트와 기타 파일을 가져와 쉽게 사용할 수 있는 구조에 넣는 프로세스입니다. 다른 패키지에 대한 종속성, 내부 구조(하위 패키지), 버전 제어, 대상 사용자, 패키지 형식(소스 코드 및/또는 바이너리)과 같은 요소를 고려해야 합니다.

간단한 예부터 시작해 보겠습니다. conman 패키지는 구성을 관리하기 위한 패키지입니다. etcd를 사용한 분산 구성은 물론 다양한 파일 형식도 지원합니다.

패키지의 콘텐츠는 일반적으로 단일 디렉터리에 저장되며(하위 패키지를 여러 디렉터리로 분할하는 것이 일반적임) 때로는(이 예에서와 같이) 자체 Git 저장소에 저장됩니다.

루트 디렉터리에는 다양한 구성 파일(setup.py이 필요하며 가장 중요한 파일)이 포함되어 있으며, 패키지 코드 자체는 일반적으로 이름이 테스트 디렉터리 이름인 하위 디렉터리에 있습니다. conman 모습은 다음과 같습니다.

으아아아 ​

setup.py 파일을 잠깐 살펴보겠습니다. setuptools 패키지에서 setup()find_packages()。然后它调用 setup() 函数并使用 find_packages() 두 가지 함수를 인수 중 하나로 가져옵니다.

으아아아 ​

정상입니다. setup.py 파일은 원하는 것은 무엇이든 할 수 있는 일반 Python 파일이지만, 주요 작업은 표준에서 호출되는 다양한 도구로 채워지기 때문에 적절한 매개변수로 setup() 함수 인수를 호출하는 것입니다. 방법. 다음 섹션에서 더 자세히 다루겠습니다.

프로필

setup.py 외에도 여기에 표시하고 다양한 목적으로 사용할 수 있는 몇 가지 선택적 구성 파일이 있습니다.

setup.py

setup() 함수는 패키지 설치의 여러 측면을 제어하고 다양한 명령을 실행하기 위해 명명된 많은 매개 변수를 사용합니다. 여러 매개변수는 저장소에 패키지를 업로드할 때 검색 및 필터링에 사용되는 메타데이터를 지정합니다.

  • name: 패키지 이름(및 PyPI에 나열되는 방법)
  • version: 이는 적절한 종속성 관리를 유지하는 데 중요합니다
  • url: 패키지의 URL, 일반적으로 GitHub 또는 readthedocs URL
  • packages:需要包含的子包列表; find_packages()도움말은 여기
  • setup_requires: 여기에 종속성을 지정하세요
  • test_suite: 테스트 중에 실행할 도구

long_description 이는 README.md 파일의 내용으로 설정되며, 이는 단일 정보 소스를 갖는 모범 사례입니다.

setup.cfg

setup.py 文件还提供命令行界面来运行各种命令。例如,要运行单元测试,您可以键入: python setup.py test

​ 으아아아

setup.cfg is 是一个 ini 格式文件,其中可能包含传递给 setup.py 的命令的选项默认值。在这里, setup.cfg 包含 nosetests에 대한 일부 옵션(테스트 실행자):

으아아아 ​

MANIFEST.in

이 파일에는 내부 패키지 디렉터리에 속하지 않지만 포함하려는 파일이 포함되어 있습니다. 일반적으로 Readme 파일, 라이센스 파일 등이 있습니다. 중요한 파일은 requirements.txt입니다. pip는 이 파일을 사용하여 다른 필수 패키지를 설치합니다.

콘맨의 MANIFEST.in 파일입니다:

으아아아 ​

종속성

setup.pyinstall_requires 섹션과 install_requires 部分和 requirements.txt 文件中指定依赖项。 Pip 将自动从 install_requires 安装依赖项,但不会从 requirements.txt 文件安装。要安装这些要求,您必须在运行 pip 时明确指定它: pip install -r requests.txtrequirements.txt

파일에서 종속성을 지정할 수 있습니다. Pip은 install_requires에서 종속성을 자동으로 설치하지만 🎜requirements.txt🎜 파일에서는 설치하지 않습니다. 이러한 요구 사항을 설치하려면 pip를 실행할 때 pip install -r 요청.txt처럼 명시적으로 지정해야 합니다. 🎜

install_requires 选项旨在指定主要版本级别的最低和更抽象的要求。 requirements.txt 文件用于更具体的要求,通常包含固定的次要版本。

这是conman的需求文件。您可以看到所有版本都已固定,这意味着如果其中一个软件包升级并引入破坏 conman 的更改,它可能会受到负面影响。

PyYAML==3.11
python-etcd==0.4.3
urllib3==1.7
pyOpenSSL==0.15.1
psutil==4.0.0
six==1.7.3
 

固定让您可预测且安心。如果许多人在不同时间安装您的软件包,这一点尤其重要。如果没有固定,每个人都会根据安装时间获得不同的依赖版本组合。固定的缺点是,如果您不跟上依赖项的开发,您可能会陷入某些依赖项的旧的、性能不佳甚至易受攻击的版本。

我最初在2014年写了conman,并没有太关注它。现在,在本教程中,我升级了所有内容,并且几乎每个依赖项都进行了一些重大改进。

发行版

您可以创建源发行版或二进制发行版。我将涵盖两者。

源分布

使用以下命令创建源发行版:python setup.py sdist。这是 conman 的输出:

> python setup.py sdist
running sdist
running egg_info
writing conman.egg-info/PKG-INFO
writing top-level names to conman.egg-info/top_level.txt
writing dependency_links to conman.egg-info/dependency_links.txt
reading manifest file 'conman.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'conman.egg-info/SOURCES.txt'
warning: sdist: standard file not found: should have one of README, README.rst, README.txt
running check
creating conman-0.3
creating conman-0.3/conman
creating conman-0.3/conman.egg-info
making hard links in conman-0.3...
hard linking LICENSE -> conman-0.3
hard linking MANIFEST.in -> conman-0.3
hard linking README.md -> conman-0.3
hard linking requirements.txt -> conman-0.3
hard linking setup.cfg -> conman-0.3
hard linking setup.py -> conman-0.3
hard linking conman/__init__.py -> conman-0.3/conman
hard linking conman/conman_base.py -> conman-0.3/conman
hard linking conman/conman_etcd.py -> conman-0.3/conman
hard linking conman/conman_file.py -> conman-0.3/conman
hard linking conman.egg-info/PKG-INFO -> conman-0.3/conman.egg-info
hard linking conman.egg-info/SOURCES.txt -> conman-0.3/conman.egg-info
hard linking conman.egg-info/dependency_links.txt -> conman-0.3/conman.egg-info
hard linking conman.egg-info/not-zip-safe -> conman-0.3/conman.egg-info
hard linking conman.egg-info/top_level.txt -> conman-0.3/conman.egg-info
copying setup.cfg -> conman-0.3
Writing conman-0.3/setup.cfg
creating dist
Creating tar archive
removing 'conman-0.3' (and everything under it)
 

如您所见,我收到一条关于缺少带有标准前缀之一的 README 文件的警告,因为我喜欢 Markdown,所以我有一个 README.md 。除此之外,还包括所有包源文件和附加文件。然后,在conman.egg-info目录中创建了一堆元数据。最后,创建一个名为 conman-0.3.tar.gz 的压缩 tar 存档,并将其放入 dist 子目录中。

安装这个包需要一个构建步骤(即使它是纯Python)。您可以正常使用 pip 安装它,只需传递包的路径即可。例如:

pip install dist/conman-0.3.tar.gz
Processing ./dist/conman-0.3.tar.gz
Installing collected packages: conman
  Running setup.py install for conman ... done 

Successfully installed conman-0.3
 

Conman 已安装到站点包中,可以像任何其他包一样导入:

import conman
conman.__file__
'/Users/gigi/.virtualenvs/conman/lib/python2.7/site-packages/conman/__init__.pyc'
 

轮子

Wheels 是一种相对较新的方式来打包 Python 代码和可选的 C 扩展。它们取代了鸡蛋的形式。轮子有几种类型:纯Python轮子、平台轮子、通用轮子。纯 Python 轮子是像 conman 这样的包,没有任何 C 扩展代码。

平台轮子确实有 C 扩展代码。通用轮子是纯 Python 轮子,兼容具有相同代码库的 Python 2 和 Python 3(它们甚至不需要 2 到 3)。

如果您有一个纯 Python 包,并且希望您的包同时支持 Python 2 和 Python 3(变得越来越重要),那么您可以构建一个通用构建,而不是为 Python 2 构建一个轮子,为 Python 构建一个轮子3.

Python 3 是当前受到积极支持的 Python 版本,不断更新、改进和社区支持;建议对所有新项目和迁移使用 Python 3。

如果你的包有C扩展代码,你必须为每个平台构建一个平台轮。轮子的巨大好处,特别是对于带有 C 扩展的软件包来说,是不需要在目标机器上提供编译器和支持库。该轮子已经包含一个内置包。所以你知道它不会构建失败,而且安装速度要快得多,因为它实际上只是一个副本。使用 Numpy 和 Pandas 等科学库的人可以真正体会到这一点,因为安装此类软件包过去需要很长时间,并且如果缺少某些库或编译器配置不正确,则可能会失败。

构建纯轮子或平台轮子的命令是:python setup.py bdist_wheel

Setuptools——提供 setup() 函数的引擎——将自动检测是否需要纯轮子或平台轮子。

running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/conman
copying conman/__init__.py -> build/lib/conman
copying conman/conman_base.py -> build/lib/conman
copying conman/conman_etcd.py -> build/lib/conman
copying conman/conman_file.py -> build/lib/conman
installing to build/bdist.macosx-10.9-x86_64/wheel
running install 

running install_lib
creating build/bdist.macosx-10.9-x86_64
creating build/bdist.macosx-10.9-x86_64/wheel
creating build/bdist.macosx-10.9-x86_64/wheel/conman
copying build/lib/conman/__init__.py -> build/bdist.macosx-10.9-x86_64/wheel/conman
copying build/lib/conman/conman_base.py -> build/bdist.macosx-10.9-x86_64/wheel/conman
copying build/lib/conman/conman_etcd.py -> build/bdist.macosx-10.9-x86_64/wheel/conman
copying build/lib/conman/conman_file.py -> build/bdist.macosx-10.9-x86_64/wheel/conman
running install_egg_info
running egg_info
creating conman.egg-info
writing conman.egg-info/PKG-INFO
writing top-level names to conman.egg-info/top_level.txt
writing dependency_links to conman.egg-info/dependency_links.txt
writing manifest file 'conman.egg-info/SOURCES.txt'
reading manifest file 'conman.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'conman.egg-info/SOURCES.txt'
Copying conman.egg-info to build/bdist.macosx-10.9-x86_64/wheel/conman-0.3-py2.7.egg-info
running install_scripts
creating build/bdist.macosx-10.9-x86_64/wheel/conman-0.3.dist-info/WHEEL
 

查看dist目录,可以看到创建了一个纯Python的轮子:

ls -la dist
dist/
total 32
-rw-r--r--  1 gigi  staff   5.5K Feb 29 07:57 conman-0.3-py2-none-any.whl
-rw-r--r--  1 gigi  staff   4.4K Feb 28 23:33 conman-0.3.tar.gz
 

名称 conman-0.3-py2-none-any.whl 有几个组件:

  • 包名称
  • 软件包版本
  • Python版本
  • 平台版本,最后是“whl”扩展。

要构建通用包,您只需添加 --universal,如 python setup.py bdist_wheel --universal

生成的轮子名为 conman-0.3-py2.py3-none-any.whl

请注意,如果您创建通用包,您有责任确保您的代码实际上可以在 Python 2 和 Python 3 下运行。

使用 Toml

Toml(Tom's Obvious Minimal Language)是一种易于使用的配置文件格式,用于配置软件应用程序。尽管 setup.py 仍然被广泛使用和支持,PEP518 建议使用 pyproject.toml 文件而不是 setup.py 进行打包和分发。

让我们使用pyproject.toml创建一个名为 apex 的简单 Python 包,用于检查电池状态并在电池充满时显示一条消息。

创建一个名为 apex 的目录结构。在 apex 内,添加一个 pyproject.toml 和一个 README.md 文件。

.apex
├── pyproject.toml
└── README.md

在根 apex 目录中,创建一个名为 apex 的子目录,其中包含一个 __init__.py 文件以使其成为一个包和一个 battery.py 文件。您的项目目录现在应如下所示:

.
├── apex
│   ├── battery.py
│   └── __init__.py
├── pyproject.toml
└── README.md

使用 pip 安装 psutil 包。

pip install psutil

Psutil(进程和系统实用程序)是一个用于 Python 中进程和系统监控的跨平台库。 Psutil 可以检索有关系统上运行的进程的信息,例如状态、CPU 使用情况和内存使用情况。它还可以操纵系统进程。

battery.py文件中,添加检查电池是否已充满的代码。

import psutil

def check_battery():
    battery = psutil.sensors_battery()
    plugged = battery.power_plugged
    percent = battery.percent

    if percent == 100 and plugged:
        print "Battery is full. Unplug your Charger"
    else:
        print "Battery is not yet full."

if __name__ == "__main__":
    message = check_battery()
    print(message)

pyproject.toml 文件包含包的元数据,包括:

  • 构建系统
  • 名称
  • 版本
  • 项目依赖项.

打开pyproject.toml并指定 setuptools 作为构建系统。

[build-system]
requires = ["setuptools","wheel"]
build-backend ="setuptools.build_meta"

指定包的名称、版本号和项目依赖项列表。现在 pyproject.toml 文件如下所示:

[build-system]
requires = ["setuptools","wheel"]
build-backend ="setuptools.build_meta"

[project]
name="apex"
version ="1.0.0"

[project-dependencies]
psutil ="5.9.5"

最后,在README.md文件中添加以下内容。

# apex

**apex** is a Python package that allows you to check the battery status of your laptop and display a message when the battery is full.

## Features

- Retrieve battery status information
- Display a message when the battery is full
- Cross-platform support (Windows, macOS, Linux, etc.)

## Installation

Install **apex** using `pip`:

```shell
pip install apex

使用 build 命令构建包。

 python -m build

您应该看到下面的输出,该输出已被我截断。

creating build/bdist.linux-x86_64/wheel/apex-1.0.0.dist-info/WHEEL
creating '/home/vaati/Desktop/apex/dist/.tmp-d8_lqaaj/apex-1.0.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'apex/__init__.py'
adding 'apex/battery.py'
adding 'apex-1.0.0.dist-info/METADATA'
adding 'apex-1.0.0.dist-info/WHEEL'
adding 'apex-1.0.0.dist-info/top_level.txt'
adding 'apex-1.0.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built apex-1.0.0.tar.gz and apex-1.0.0-py3-none-any.whl

构建会创建一个 dist 文件夹,其中包含包的分发文件:

  • apex-1.0.0.tar.gz:apex 包的源发行版。它包含安装该软件包所需的源代码。
  • apex-1.0.0-py3-none-any.whl:apex 包的二进制发行版。您可以使用二进制发行版直接从源代码安装它。

构建过程还会生成一个 apex.egg-info 文件夹,其中包含有关包的元数据。

.
├── apex
│   ├── battery.py
│   └── __init__.py
├── apex.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── dist
│   ├── apex-1.0.0-py3-none-any.whl
│   └── apex-1.0.0.tar.gz
├── pyproject.toml
└── README.md

结论

编写自己的 Python 包需要处理大量工具,指定大量元数据,并仔细考虑您的依赖项和目标受众。但回报是巨大的。

如果您编写有用的代码并正确打包它,人们将能够轻松安装它并从中受益。

위 내용은 나만의 Python 패키지 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.