【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='[email protected]',  # 作者的有效邮箱地址
    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 令牌,以便能够安全地上传的项目。

转到pypi.org/manage/acco… 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
复制代码

参考文档

packaging.python.org/en/latest/g…

packaging.python.org/en/latest/g…

pypi.org/help/#file-…

twine.readthedocs.io/en/stable/

猜你喜欢

转载自juejin.im/post/7053009657371033630