当前位置:首页 > 技术 > 正文内容

将Python包发布至PyPI的完整流程

访客 技术 2026年6月16日 1

配置PyPI账户与上传凭证

在发布前,需先在 PyPI官网 注册账号,并为本地工具配置认证信息。创建或修改用户主目录下的 .pypirc 文件:

vim ~/.pypirc

填入以下内容:

[distutils]
index-servers = pypi

[pypi]
repository: https://upload.pypi.org/legacy/
username: your_pypi_username
password: your_pypi_password

注意:自2023年起,建议使用API token代替明文密码以提升安全性。

标准项目结构设计

一个符合PyPI发布的典型Python项目应包含如下结构:

.
├── LICENSE
├── MANIFEST.in
├── README.md
├── mypackage
│   └── __init__.py
├── setup.py
└── tests
    └── test_mypackage.py

若开发的是pytest插件,则结构略有不同:

├── pytest_custom_marker
│   ├── __init__.py
│   └── plugin.py
├── setup.py
└── tests
    └── test_plugin.py

推荐使用 cookiecutter 工具基于模板快速生成专业结构,例如通过命令:
pip install cookiecutter
再执行:
cookiecutter gh:audreyr/cookiecutter-pypackage

编写setup.py配置文件

该文件是打包的核心,定义了包的元数据和依赖关系。基础版本示例如下:

import os
from setuptools import setup, find_packages

def load_readme():
    here = os.path.abspath(os.path.dirname(__file__))
    readme_path = os.path.join(here, 'README.md')
    with open(readme_path, 'r', encoding='utf-8') as f:
        return f.read()

setup(
    name='mypackage',
    version='0.1.0',
    author='Your Name',
    author_email='your.email@example.com',
    description='A short summary of the package',
    long_description=load_readme(),
    long_description_content_type='text/markdown',
    url='https://github.com/yourname/mypackage',
    packages=find_packages(include=['mypackage']),
    include_package_data=True,
    python_requires='>=3.6',
    install_requires=[],
    classifiers=[
        'Development Status :: 4 - Beta',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
        'Programming Language :: Python :: 3.8',
        'Programming Language :: Python :: 3.9',
    ],
)

针对pytest插件的特殊配置

若构建的是pytest扩展,需在 setup.py 中声明入口点:

setup(
    name='pytest-custom-marker',
    version='0.1.0',
    packages=find_packages(include=['pytest_custom_marker']),
    install_requires=['pytest'],
    entry_points={
        'pytest11': [
            'custom_marker = pytest_custom_marker.plugin'
        ]
    },
    # 其他字段...
)

其中 pytest11 是pytest识别插件的关键命名空间,确保其正确注册后,pytest运行时会自动加载该模块。

使用Twine进行安全打包与发布

推荐使用 twine 进行构建和上传,因其支持验证和加密传输:

pip install twine

生成源码分发包:

python setup.py sdist

上传至PyPI:

twine upload dist/*

首次上传前可先推送到测试仓库验证:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。