Python: 代码打成pip包并发布到PyPi

1. 首先要准备一个pypi账户,有账户可跳过这个步骤。

此处需要只需要一个自己可控制的邮箱地址。

Create an account · PyPI

注册完成别忘了去邮箱激活一下。

然后对账户进行2FA验证和token生成,上传包到pypi上此处为必须要做的。如果没有经过2FA认证,上传时会报错认证失败。

此处一定要记住2FA的验证码和recoverycode,不然会对以后登录造成很大困扰。(我最后翻了local history代码记录,才把2FA从新生成一次成功登录)

2. 2FA认证

2FA认证是pypi强制开启的多因子认证,可以通过多种方式进行认证。

我们这里不装APP, 直接使用简单python脚本来完成认证。

打开 Account settings 页面,找到2FA设置区域。

选择使用APP认证

将此处的code copy出来

打开python环境, 安装包

pip install pyotp

执行代码

import pyotp

key = 'TS***-you key copy here-***MKPE'
totp = pyotp.TOTP(key)
print(totp.now())

执行会打印一个6位数字,一定要记住,它与用户名密码一起作为登录的凭据。

如果想知道原理,移步 什么是双因素验证 2FA,如何用 Python 实现?-CSDN博客

如果系统提示你要recovery code, 那就生成一次recovery code,点击这里会跳出登录密码验证

在弹出页面中输入密码verify

会得到一批code, 用记事本记住它,万一哪天忘记了2FA code,这里每一个code可以提供一次认证恢复,用后即废。

token api

下面来生成token api,是上传到pypi所用到的,我们上传包并非要 username 和 password,使用token进行上传。

打开 Account settings 页面,找到token设置区域,添加token即可,name只是为了标记你的token是干啥用的,token字符串是真实要用的。

2. 账户准备完毕,开始生包上传

我使用的是python 3.8环境,写了一个简单的工程。

目录结构是这个样子

_util: 外层文件夹包

_util: 项目Python package

LICENSE:许可协议

MANIFEST.in:这个是非必要的,我的项目中有logging.yaml 这类非python配置文件,并且需要打入包里,这个文件就需要了。

README.md:描述文件

setup.py:打包执行的配置文件。

每个文件内容:

LICENSE 开源的话一般使用MIT或者Apache协议

Copyright (c) 2018 The Python Packaging Authority

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.

MANIFEST.in 说明了准备将什么文件一起打包到wheel中,我这里要打yaml

# Include all yaml files

global-include *.yaml

README.md 自己随便写点什么描述吧,不然几个月之后你也不知道这东西都干了啥。

setup.py 内容

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

# 配置项比较多,有些不是必须,可参考官方文档 https://packaging.python.org/guides/distributing-packages-using-setuptools/
setuptools.setup(
    name="******", # 项目的名字,将来通过pip install ******安装,不能与其他项目重复,否则上传失败
    version="0.0.1", # 项目版本号,自己决定吧
    author="Mcrazji", # 作者
    author_email="123456@yeah.net", # email
    description="python项目的**********工具",  # 项目描述
    long_description=long_description, # 加载read_me的内容
    long_description_content_type="text/markdown", # 描述文本类型
    url="",  # 项目的地址,比如github或者gitlib地址
    packages=setuptools.find_packages(),  # 这个函数可以帮你找到包下的所有文件,你可以手动指定
    package_data={'': ['*.yaml', '*.csv', '*.txt', '.toml']},  # 这个很重要,要与 MANIFEST.in也要有
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ], # 该软件包仅与Python 3兼容,根据MIT许可证进行许可,并且与操作系统无关。您应始终至少包含您的软件包所使用的Python版本,软件包可用的许可证以及您的软件包将使用的操作系统。有关分类器的完整列表,请参阅 https://pypi.org/classifiers/。
    install_requires=[
        'pyyaml'
    ], # 项目依赖,也可以指定依赖版本
)

OK ,进入setup.py目录,检查语法

python3 setup.py check

会出现这种打印,就是成功了

安装好打包工具,之前安装过不需要重复安装

python3 -m pip install --user --upgrade setuptools wheel

安装完成进行打包

python3 setup.py sdist bdist_wheel

控制台会打印一堆堆,没error就中,项目多出来这几个文件夹

安装上传工具,之前安装过不需要重复安装

python3 -m pip install --user --upgrade twine

dist文件夹内容即上传内容(这是上传到pypi正式环境,测试环境使用以下)

# 正式环境
python -m twine upload dist/* 
# 测试环境,如果使用测试环境,安装也要用测试环境
python -m twine upload --repository testpypi dist/*

此处要注意:

我们可以将username和password内容放根目录配置文件,直接跳过输入,当前这种方式需要输入username和password。

macos添加配置文件方式:

vi ~/.pypirc

添加内容:

[pypi]
username=__token__
password=pypi-AgEIcHlwaS***--from this insert you real token key -*******5ZDMtYWUyMC1mOTgyMjk0ZDkxNjkiXQAABiCX3o55E4EzYyuh0VN1KFRvunOP1YNMxDKSGyjOBWOE0A

如果error返回401或认证失败,进行2FA认证以及token申请操作

如果error返回400-different-version,说明已经推送上去了这个版本,从setup中换一个版本推送。

验证安装

为防止配置了其他的源干扰安装,可以直接指定地址,其他源同步时间分钟-小时不等。

# 正式环境
pip install ***_util==0.0.1  -i http://mirrors.jd.com/pypi/web/simple
# 测试环境
pip install ***_util==0.0.1  -i https://test.pypi.org/simple/


当然可以从页面上直接看到自己上传的project内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值