本文主要翻译自官方文档: Packaging Python Projects
创建项目
项目需要有以下的文件结构:
1 2 3 4 5 6 7 |
packaging_tutorial/ example_pkg/ __init__.py setup.py LICENSE README.md |
example_pkg是包的文件名,因为是python包,所以要有__init__.py
,setup.py是安装的配置脚本,LICENSE是使用许可,README.md是Markdown格式的说明文档。
创建并配置 setup.py
以下是我的一个setup.py文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import re import setuptools from setuptools import setup with open('torch_template/version.py') as fid: try: __version__, = re.findall( '__version__ = "(.*)"', fid.read() ) # 获取版本号 except: raise ValueError("could not find version number") with open("README.md", "r") as fh: long_description = fh.read() # 获取 README.md (会显示在PyPi主页上) setup( name='torch-template', version=__version__, description='Torch_Template - A PyTorch template with commonly used models and tools', long_description=long_description, # (会显示在PyPi主页上) long_description_content_type="text/markdown", # ReadMe如果使用Markdown格式,需要显示指定,默认为Sphinx格式 url='https://github.com/misads/torch_template', # 项目链接(一般是GitHub或者网站主页) author='xyu.ink', author_email='xuhaoyu@tju.edu.cn', license='MIT', install_requires=[ "torch", "numpy", "torchvision", "tensorboardX", ], # 需要安装的依赖,pip安装自己的包时会先安装依赖 packages=['torch_template', 'torch_template/utils'], # 需要包含哪些包,也可以使用setuptools.find_packages()自动搜索 classifiers=[ "Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent" ], # 版本、语言、使用许可等信息 python_requires='>=3.5', # 要求的python版本 ) |
创建 Readme.md 和 LICENSE
这一步和在GitHub创建相同,所以省略,详细可以看参考链接。
生成发行版文件
先安装wheel
1 2 |
pip3 install --user --upgrade setuptools wheel |
运行以下命令
1 2 |
python3 setup.py sdist bdist_wheel |
会在项目根目录生成一个dist目录,并在dist目录下生成两个文件。
1 2 3 4 |
dist/ example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz |
上传发行版文件
安装twine(用来把打包好的文件上传到pypi)
1 2 |
pip3 install --user twine |
上传到测试版pypi(需要先在TestPypi注册一个账号,和PyPi是独立的)
1 2 |
twine upload --repository-url https://test.pypi.org/legacy/ dist/* |
上传成功后,可以在TestPyPi上看到自己的项目
1 2 3 4 5 6 7 8 |
Uploading distributions to https://test.pypi.org/legacy/ Enter your username: [your username] Enter your password: Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl 100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s] Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz 100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s] |
使用pip安装自己的包
1 2 |
pip3 install -i https://test.pypi.org/simple/ example-pkg-YOUR-USERNAME-HERE |
安装成功后检查是否已经成功安装,打开python终端
1 2 |
python |
运行
1 2 |
>>> import example_pkg |
如果没有报错说明安装成功了,注意不要在项目目录下打开python终端,因为项目文件中的相对路径中有example_pkg,可能是使用了相对路径导包而不是成功导入系统包。
上传到pypi
OK,一切都已经测试完毕了,最后,运行下面的命令将发行版本上传到PyPi(要先注册一个PyPi账号)
1 2 |
twine upload dist/* |
使用pip安装:
1 2 |
pip3 install -i https://pypi.org/simple/ example-pkg |
这时要使用官方源安装,因为刚上传上去,国内源(清华、中科大、阿里等)还没有和官方源同步。
注意每个版本号是唯一的,上传成功后上传的版本号即被用久占用,以后同一个包不能再使用这个版本号(即使把原来的删除了也不可以)。