以前写过一篇类似的文章: 如何打包自己的项目并且发布到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文件
- 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
是否有错误,如果没报错误,则进行下一步
-
注册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.in
将requirements.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
来安装和使用发布的包了