Python | 如何发布自己的库到 PYPI(可通过pip安装)
在我们安装 Python第三方库的时候,通常都是通过pip命令安装。
pip install xxx
真是又酷炫又方便!
那么,当我们自己写了一些自认为不错的库,想要分享给大家使用(或者是想要装X时)能不能也能做到这样呢?
来源:知乎 - 霾大
链接:https://zhuanlan.zhihu.com/p/79164800
环境需求
1. 拥有一个 PyPI · The Python Package Index 的账号
2. 已经写好能正常使用的库/方法/项目 (可本地调用)
步骤
1. 创建一个这样的目录结构,我们接下来的命令都在 example_pkg/__init__.py
目录进行
/packaging_tutorial
/example_pkg
__init__.py
2. 编辑 example_pkg/__init__.py
,写入以下内容
name = "example_pkg"
3. 创建 packaging_tutorial/setup.py
setup.py 是 setuptools 的构建脚本,用于告知 setuptools 我们要上传到PYPI的库的信息(库名、版本信息、描述、环境需求等)。
下面是 setup.py 的示例:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="example-pkg-your-username",
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
参数解析
name:库名
version:版本号
author:作者
author_email:作者邮箱(如:别人发现了bug或者提建议给我们添加功能联系我们用的)
description:简述
long_description:详细描述(一般会写在README.md中)
long_description_content_type:README.md中描述的语法(一般为markdown)
url:库/项目主页,一般我们把项目托管在GitHub,放该项目的GitHub地址即可
packages:使用setuptools.find_packages()即可,这个是方便以后我们给库拓展新功能的(详情请看官方文档)
classifiers:指定该库依赖的Python版本、license、操作系统之类的
4. 创建 packaging_tutorial/README.md
,向其写入自己对该库的简介、描述。
# Example Package
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
5. 创建 packaging_tutorial/LICENSE
,对于每一个创建的库来说 LICENSE 是很重要的,这告诉大家我们的库能用在什么方面(商用?之类的)还有免责啊之类的;一般来说我们选择MIT。
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MIT LICENSE 的大概意思是
软件可以随便用,随便改
可以免费,可以收费
软件的源文件里必须有这个许可证文档
我提供这个软件不是为了犯法,你要用它来犯法,那与我无关
你用这个软件犯事了,责任全在你自己,与其他贡献者无关
关于 setup.py 的写法,大家可以参照我先前写的 maida
库,地址我会放在文末。
6. 确保我们已安装最新setuptools
和 wheel
和twine
,下面是安装/更新命令
python3 -m pip install --user --upgrade setuptools wheel twine
7. 打包的我们的库/项目
python3 setup.py sdist bdist_wheel
此时在当前目录我们会看到以下:
dist/
example_pkg_your_username-0.0.1-py3-none-any.whl
example_pkg_your_username-0.0.1.tar.gz
8. 使用 twine 将打包好的库/项目上传到PYPI
(需用到PYPI帐号密码)(此时只是上传到PYPI测试服,还不能 pip install 这个库/项目)
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
我们会看到如下界面:
上传成功之后,我们可以去PYPI的测试服查看是否上传成功,能上传成功的话就说明肯定也能成功上传到PYPI正式服(附:PYPI测试服地址)。
PYPI测试服的管理员会不定期删除上边的库,正式投入使用还是得上传到正式服。由于我先前有上传库到测试服,我们可以尝试搜索看看。
若是想测试下上传到测试服的库能否使用,可以使用如下命令:
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-your-username
大致会出现以下:
Collecting example-pkg-your-username
Downloading https://test-files.pythonhosted.org/packages/.../example-pkg-your-username-0.0.1-py3-none-any.whl
Installing collected packages: example-pkg-your-username
Successfully installed example-pkg-your-username-0.0.1
若是从测试服安装的我们的库能正常使用,那么我们就可以开始行动把它上传到PYPI正式服供大家使用了。(之所以特地提出这一步,是因为第一次上传库时,我们总会因为目录结构不会、未打包成库可正常使用打包了却不能用等等原因导致上传的是个“失败的库”,这样能避免别人会安装到我们的失败库)。
简单测试是否能正常使用直接如下即可,但具体里边的功能能否正常用我们还需调用一下,此处不做介绍。
>>> import example_pkg
>>> example_pkg.name
'example_pkg'
9. 【重头戏】将库上传到 PYPI正式服
twine upload dist/*
上传成功后该库即可直接pip安装。
如何指定安装自己库的依赖库
setup(
...
install_requires=[
'你的库依赖的第三方库(也可以指定版本)',
# exapmle
'pyautogui',
'Django >= 1.11, != 1.11.1, <= 2',
],
)
官方文档传送门
Packaging Python Projects
https://packaging.python.org/tutorials/packaging-projects/
有知有行
[ 完 ]
对了,看完记得一键四连,这个对我真的很重要。