创建项目

项目需要有以下的文件结构:

packaging_tutorial/
example_pkg/
__init__.py
setup.py
LICENSE
README.md

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文件。

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版本
)


importre
importsetuptools
fromsetuptoolsimportsetup
withopen('torch_template/version.py')asfid:
try:
__version__,=re.findall('__version__ = "(.*)"',fid.read())# 获取版本号
except:
raiseValueError("could not find version number")
withopen("README.md","r")asfh:
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

pip3 install --user --upgrade setuptools wheel


pip3install--user--upgradesetuptoolswheel

运行以下命令

python3 setup.py sdist bdist_wheel


python3setup.pysdistbdist_wheel

会在项目根目录生成一个dist目录,并在dist目录下生成两个文件。

dist/

example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl

example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz


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)

pip3 install --user twine


pip3install--usertwine

上传到测试版pypi(需要先在TestPypi注册一个账号,和PyPi是独立的)

twine upload --repository-url https://test.pypi.org/legacy/ dist/*


twineupload--repository-urlhttps://test.pypi.org/legacy/dist/*

上传成功后,可以在TestPyPi上看到自己的项目

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]


Uploadingdistributionstohttps://test.pypi.org/legacy/
Enteryourusername:[yourusername]
Enteryourpassword:
Uploadingexample_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100%|█████████████████████|4.65k/4.65k[00:01<00:00,2.88kB/s]
Uploadingexample_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz
100%|█████████████████████|4.25k/4.25k[00:01<00:00,3.05kB/s]

使用pip安装自己的包

pip3 install -i https://test.pypi.org/simple/ example-pkg-YOUR-USERNAME-HERE


pip3install-ihttps://test.pypi.org/simple/example-pkg-YOUR-USERNAME-HERE

安装成功后检查是否已经成功安装,打开python终端

python


python

运行

>>> import example_pkg


>>>importexample_pkg

如果没有报错说明安装成功了,注意不要在项目目录下打开python终端,因为项目文件中的相对路径中有example_pkg,可能是使用了相对路径导包而不是成功导入系统包。

上传到pypi

OK,一切都已经测试完毕了,最后,运行下面的命令将发行版本上传到PyPi(要先注册一个PyPi账号)

twine upload dist/*


twineuploaddist/*

使用pip安装:

pip3 install -i https://pypi.org/simple/ example-pkg


pip3install-ihttps://pypi.org/simple/example-pkg

这时要使用官方源安装,因为刚上传上去,国内源(清华、中科大、阿里等)还没有和官方源同步。

注意每个版本号是唯一的,上传成功后上传的版本号即被用久占用,以后同一个包不能再使用这个版本号(即使把原来的删除了也不可以)。