【python】上传 Python 包到 pypi 官网
一. 概述
在上一篇【爬虫】将scrapy部署到k8s文章中提到在自定义 spiderkeeper
镜像时报错,所以自己基于它的源码提交了一个叫做 spiderkeeper-new
的 python
包到 pypi
官网,本文将记录一下整个构建过程,希望对有同样需求的小伙伴提供一些帮助。
二. 上传 Python 包到 pypi 官网
首先还是查看官方文档,官方文档写的很详细,阅读完官方文档之后,就知道了整个构建流程,这里主要是对阅读的文档做一个总结,省去了很多细节的介绍,便于快速上手体验。
1. 配置项目
在项目的根目录下面创建一个 setup.py
文件,这里以 spiderkeeper
的内容为例,setup.py
文件的内容如下:
#!/usr/bin/env python
from os import path
from setuptools import setup, find_packages
here = path.abspath(path.dirname(__file__))
with open(path.join(here, 'requirements.txt'), 'r', encoding='utf-8') as f:
all_reqs = f.read().split('\n')
with open(path.join(here, 'README.md'), 'r', encoding='utf-8') as f:
long_description = f.read()
install_requires = [x.strip() for x in all_reqs if 'git+' not in x]
setup(
name='SpiderKeeper-new', # 必填,项目的名字,用户根据这个名字安装,pip install SpiderKeeper-new
version='1.0.0', # 必填,项目的版本,建议遵循语义化版本规范
author='edisonwd', # 项目的作者
description='Admin ui for spider service, update info: upgrade dependent package', # 项目的一个简短描述
long_description=long_description, # 项目的详细说明,通常读取 README.md 文件的内容
long_description_content_type='text/markdown', # 描述的格式,可选的值: text/plain, text/x-rst, and text/markdown
author_email='2388100489@qq.com', # 作者的有效邮箱地址
url='https://github.com/edisonwd/SpiderKeeper', # 项目的源码地址
license='MIT',
include_package_data=True,
packages=find_packages(), # 必填,指定打包的目录,默认是当前目录,如果是其他目录比如 src, 可以使用 find_packages(where='src')
install_requires=install_requires, # 指定你的项目依赖的 python 包,这里直接读取 requirements.txt
# 下面的设置将在命令行提供一个叫做 spiderkeeper 的命令,用来执行 SpiderKeeper 包下 run 的 main 方法启动项目
entry_points={
'console_scripts': {
'spiderkeeper = SpiderKeeper.run:main'
},
},
# 分类器通过对项目进行分类,帮助用户找到项目
classifiers=[
'Development Status :: 4 - Beta',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.7',
],
)
上面的 setup.py
文件中引用了 requirements.txt
和 README.md
这两个文件,默认情况下,打包 python 的源码发行包中只包含 py 文件,如果安装的时候没有引入那两个文件会报错。要打包其他的文件到发行包中,需要在 MANIFEST.in
文件中指定,spiderkeeper 的 MANIFEST.in
内容如下:
recursive-include SpiderKeeper/app/templates *
recursive-include SpiderKeeper/app/static *
include requirements.txt
include README.md
2. 打包项目
在构建项目的 sdists
和 wheel
之前,需要先安装 build
包,使用如下命令:
pip install build
在 setup.py
文件的位置使用下面的命令构建项目的源码包和 wheel 包:
python -m build
-m 选项后面的内容是 module(模块),其作用是把模块当成脚本来运行。
如果只想构建源码包,可以执行下面的命令:
python -m build --sdist
如果只想构建 wheel 包,可以执行下面的命令:
python -m build --wheel
构建完成之后,会在项目的根目录下生成一个 dist/
目录存放构建的包。
3. 上传项目到 pypi
twine
是一个上传 python 包到 pypi 的工具,使用下面的命令安装:
pip install twine
在上传之前,使用下面的命令检查构建的包是否有问题:
twine check dist/*
创建账户
首先,需要一个PyPI用户帐户。可以使用 PyPI 网站上的表格创建一个帐户 。
现在将创建一个 PyPI API 令牌,以便能够安全地上传的项目。
转到https://pypi.org/manage/account/#api-tokens并创建一个新的 API 令牌;不要将其范围限制在特定项目,因为正在创建一个新项目。
在复制并保存令牌之前不要关闭页面 - 将不会再看到该令牌。
为避免每次上传时都必须复制和粘贴令牌,可以创建一个$HOME/.pypirc
文件:
[pypi]
username = __token__
password = <the token value, including the `pypi-` prefix>
请注意,这会将的令牌以明文形式存储。
有关更多详细信息,请参阅.pypirc
.
上传你的发行版
一旦你有了一个帐户,你就可以 使用twine将你的发行版上传到PyPI。
无论项目是否已存在于 PyPI 上,上传版本的过程都是相同的 - 如果尚不存在,它将在上传第一个版本时自动创建。
对于第二个和后续版本,PyPI 只要求新版本的版本号与任何以前的版本不同。
twine upload dist/*
可以通过导航到上传的项目名称https://pypi.org/project/<sampleproject>
所在的 URL 来查看的包是否已成功 传,上传的项目可能需要一两分钟才能出现在网站上。
三. 遇到的问题
使用 pip install 安装包的时候提示升级,使用如下命令:
pip install --upgrade pip setuptools wheel
报错如下:
ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: 'e:\\anaconda3\\scripts\\pip.exe'
Consider using the `--user` option or check the permissions.
再次执行 pip 命令,报错如下:
> pip
Script file 'E:\anaconda3\Scripts\pip-script.py' is not present
原因分析
在使用 pip install --ugrade pip 命令升级的时候,会先将原来的 pip 卸载掉再安装新版本的 pip,但是在成功卸载之后,由于权限的问题无法安装新版本 pip ,所以 pip 就没法使用了。
解决方法
使用以下方法来安装:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本
$ python get-pip.py # 运行安装脚本
注意:用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本,如果是 Python3 则执行以下命令:
$ sudo python3 get-pip.py # 运行安装脚本。
一般情况 pip 对应的是 Python 2.7,pip3 对应的是 Python 3.x。
部分 Linux 发行版可直接用包管理器安装 pip,如 Debian 和 Ubuntu:
sudo apt-get install python-pip
参考文档
https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/
https://packaging.python.org/en/latest/guides/using-testpypi/