如何将自己的Python包发布到PyPI

以前写过一篇类似的文章: 如何打包自己的项目并且发布到pypi上,不过由于PyPI进行了一些更新,因此旧方法不大适用了。趁端午有时间,想把haipproxy的客户端发布到PyPI,以改进用户体验,因此这次又尝试了如何将Python包发布到新版本的PyPI上。

编写setup.py

haipproxy为例,它的setup.py如下

from os import path as os_path
from setuptools import setup

import haipproxy

this_directory = os_path.abspath(os_path.dirname(__file__))

# 读取文件内容
def read_file(filename):
    with open(os_path.join(this_directory, filename), encoding='utf-8') as f:
        long_description = f.read()
    return long_description

# 获取依赖
def read_requirements(filename):
    return [line.strip() for line in read_file(filename).splitlines()
            if not line.startswith('#')]

setup(
    name='haipproxy',  # 包名
    python_requires='>=3.4.0', # python环境
    version=haipproxy.__version__, # 包的版本
    description="High aviariable proxy pool client for crawlers.",  # 包简介,显示在PyPI上
    long_description=read_file('README.md'), # 读取的Readme文档内容
    long_description_content_type="text/markdown",  # 指定包文档格式为markdown
    author="Resolvewang", # 作者相关信息
    author_email='resolvewang@foxmail.com',
    url='https://github.com/SpiderClub/haipproxy',
    # 指定包信息,还可以用find_packages()函数
    packages=[
        'haipproxy',
        'haipproxy.client',
        'haipproxy.utils'
    ],
    install_requires=read_requirements('requirements.txt'),  # 指定需要安装的依赖
    include_package_data=True,
    license="MIT",
    keywords=['proxy', 'client', 'haipproxy'],
    classifiers=[
        'Intended Audience :: Developers',
        'License :: OSI Approved :: MIT License',
        'Natural Language :: English',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
    ],
)

除了setup.py,还有个和包有关的文件为setup.cfg,由于对其还未使用需求,所以这里也不展开讲了。

使用Markdown文件作为项目的Readme

新版PyPI一个令人欣喜的功能是提供了Markdown文档的支持。需要做下面的工作以支持Markdown文件

  1. setup.py 中添加添加新参数,内容如下
    long_description=read_file('README.md'),
    long_description_content_type="text/markdown",  # 新参数

2.更新 setuptools,因为setuptools>= 38.6.0 才能使用新的元数据生成发布包。

pip install -U setuptools

3.用 twine上传分发包,并且只有 twine> = 1.11.0 才能将元数据正确发送到 Pypi上

pip install -U twine

打包项目并上传

1.运行python setup.py check检查setup.py是否有错误,如果没报错误,则进行下一步

  1. 注册PyPI帐号,注册完成之后,在本机(Linux或者Mac)创建~/.pypirc文件,文件内容如下
[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = xxxx  # pypi登录用户名
password = xxxx  # pypi登录密码

3.创建MANIFEST.in文件,它的作用在于包含一些和包同级的文件,比如我的包结构为

-- haipproxy
  -- haiproxy
      -- __init__.py
  -- README.md
  -- requirements.txt
  -- LICENSE

如果不通过MANIFEST.inrequirements.txt打包到待发布的包中,那么安装的时候就可能出现FileNotFoundError,因此需要将该文件包含到需要发布的包中

include *.in
include *.ini
include *.rst
include *.txt
include LICENSE

global-exclude __pycache__ *.py[cod]
global-exclude *.so *.dylib

4.生成源码分发包

python setup.py sdist

运行该命令之后,会生成一个haipproxy.egg-info文件夹,可以查看其中的SOURCES.txt文件,以确定是否所有需要的内容都已经被包括在待发布的包中

5.上传分发包

twine upload dist/* # 也可以单独指定 dist 文件夹中的某个版本的发布包

上传成功之后,便可以使用pip install package_name来安装和使用发布的包了

    原文作者:resolvewang
    原文地址: https://www.jianshu.com/p/eb7caacf7491
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞