美文网首页我的Python之旅
如何将自己的Python包发布到PyPI

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

作者: resolvewang | 来源:发表于2018-06-17 21:47 被阅读28次

    以前写过一篇类似的文章: 如何打包自己的项目并且发布到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来安装和使用发布的包了

    相关文章

      网友评论

        本文标题:如何将自己的Python包发布到PyPI

        本文链接:https://www.haomeiwen.com/subject/fbsweftx.html