如何将自己的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来安装和使用发布的包了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,861评论 1 3
  • 本站文章除注明转载外,均为本站原创或者翻译。 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重...
    Michael_林阅读 720评论 1 1
  • 这里就不讲三方包和模块的概念以及什么发展史了,直接进主题; 安装方式:分为本地安装和远程安装 本地安装: 1.对于...
    hello_我的哥阅读 2,119评论 2 4
  • 养车入口技术支持电话:
    米匠阅读 666评论 2 0
  • 春季养生应遵循养阴防风的原则。春季,人体阳气上升,因此要注意保护体内的阳气。 中医养生学理论认为“春与肝相应”...
    庆文微生活阅读 424评论 1 0