【python】上传 Python 包到 pypi 官网

一. 概述

在上一篇【爬虫】将scrapy部署到k8s文章中提到在自定义 spiderkeeper 镜像时报错,所以自己基于它的源码提交了一个叫做 spiderkeeper-newpython 包到 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.txtREADME.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. 打包项目

在构建项目的 sdistswheel 之前,需要先安装 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/

https://pypi.org/help/#file-name-reuse

https://twine.readthedocs.io/en/stable/

本文作者:blogwd

本文链接:https://www.cnblogs.com/blogwd/p/15801098.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   blogwd  阅读(227)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 不要说话 REOL
  2. 2 这世界那么多人 REOL
  3. 3 盛夏的果实 REOL
这世界那么多人 - REOL
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王海涛

作曲 : Akiyama Sayuri

编曲 : 彭飞

制作人 : 荒井十一/彭飞

这世界有那么多人

人群里 敞着一扇门

我迷朦的眼睛里长存

初见你 蓝色清晨

这世界有那么多人

多幸运 我有个我们

这悠长命运中的晨昏

常让我 望远方出神

灰树叶飘转在池塘

看飞机轰的一声去远乡

光阴的长廊 脚步声叫嚷

灯一亮 无人的空荡

晚风中闪过 几帧从前啊

飞驰中旋转 已不见了吗

远光中走来 你一身晴朗

身旁那么多人 可世界不声 不响

这世界有那么多人

多幸运 我有个我们

这悠长命运中的晨昏

常让我 望远方出神

灰树叶飘转在池塘

看飞机轰的一声去远乡

光阴的长廊 脚步声叫嚷

灯一亮 无人的空荡

晚风中闪过 几帧从前啊

飞驰中旋转 已不见了吗

远光中走来 你一身晴朗

身旁那么多人 可世界不声 不响

笑声中浮过 几张旧模样

留在梦田里 永远不散场

暖光中醒来 好多话要讲

世界那么多人 可是它不声 不响

这世界有那么个人

活在我 飞扬的青春

在泪水里浸湿过的长吻

常让我 想啊想出神

弦乐 : 彭飞

吉他 : 胡洋

曼陀林 : 彭飞

鼓 : 荒井十一

录音室 : Studio 21A

录音师 : 倪涵文

混音室 : Studio 21A

混音师 : 周天澈

母带工程师 : 周天澈