以前寫過一篇類似的文章: 如何打包自己的項(xiàng)目并且發(fā)布到pypi上,不過由于PyPI進(jìn)行了一些更新,因此舊方法不大適用了。趁端午有時(shí)間,想把haipproxy的客戶端發(fā)布到PyPI,以改進(jìn)用戶體驗(yàn),因此這次又嘗試了如何將Python包發(fā)布到新版本的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__))
# 讀取文件內(nèi)容
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環(huán)境
version=haipproxy.__version__, # 包的版本
description="High aviariable proxy pool client for crawlers.", # 包簡介,顯示在PyPI上
long_description=read_file('README.md'), # 讀取的Readme文檔內(nèi)容
long_description_content_type="text/markdown", # 指定包文檔格式為markdown
author="Resolvewang", # 作者相關(guān)信息
author_email='resolvewang@foxmail.com',
url='https://github.com/SpiderClub/haipproxy',
# 指定包信息,還可以用find_packages()函數(shù)
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,還有個(gè)和包有關(guān)的文件為setup.cfg,由于對(duì)其還未使用需求,所以這里也不展開講了。
使用Markdown文件作為項(xiàng)目的Readme
新版PyPI一個(gè)令人欣喜的功能是提供了Markdown文檔的支持。需要做下面的工作以支持Markdown文件
- setup.py 中添加添加新參數(shù),內(nèi)容如下
long_description=read_file('README.md'),
long_description_content_type="text/markdown", # 新參數(shù)
2.更新 setuptools,因?yàn)?code>setuptools>= 38.6.0 才能使用新的元數(shù)據(jù)生成發(fā)布包。
pip install -U setuptools
3.用 twine上傳分發(fā)包,并且只有 twine> = 1.11.0 才能將元數(shù)據(jù)正確發(fā)送到 Pypi上
pip install -U twine
打包項(xiàng)目并上傳
1.運(yùn)行python setup.py check檢查setup.py是否有錯(cuò)誤,如果沒報(bào)錯(cuò)誤,則進(jìn)行下一步
-
注冊(cè)PyPI帳號(hào),注冊(cè)完成之后,在本機(jī)(
Linux或者M(jìn)ac)創(chuàng)建~/.pypirc文件,文件內(nèi)容如下
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = xxxx # pypi登錄用戶名
password = xxxx # pypi登錄密碼
3.創(chuàng)建MANIFEST.in文件,它的作用在于包含一些和包同級(jí)的文件,比如我的包結(jié)構(gòu)為
-- haipproxy
-- haiproxy
-- __init__.py
-- README.md
-- requirements.txt
-- LICENSE
如果不通過MANIFEST.in將requirements.txt打包到待發(fā)布的包中,那么安裝的時(shí)候就可能出現(xiàn)FileNotFoundError,因此需要將該文件包含到需要發(fā)布的包中
include *.in
include *.ini
include *.rst
include *.txt
include LICENSE
global-exclude __pycache__ *.py[cod]
global-exclude *.so *.dylib
4.生成源碼分發(fā)包
python setup.py sdist
運(yùn)行該命令之后,會(huì)生成一個(gè)haipproxy.egg-info文件夾,可以查看其中的SOURCES.txt文件,以確定是否所有需要的內(nèi)容都已經(jīng)被包括在待發(fā)布的包中
5.上傳分發(fā)包
twine upload dist/* # 也可以單獨(dú)指定 dist 文件夾中的某個(gè)版本的發(fā)布包
上傳成功之后,便可以使用pip install package_name來安裝和使用發(fā)布的包了