用了Python这么久,你连这个都没试过?_python

众所周知,Python如此好用的一个重要原因是有很多优秀的第三方库,例如numpy,pandas,tqdm,transformers,torch等等。

本文将手把手带领大家把代码打包成第三方库,供自己和他人使用。

1.打包初衷

最近由于项目需要,我把以前的比赛代码做了重构,并写了一套训练框架。使用这套框架时,我意识到:如果在其他项目中沿用这套框架,还得先把代码库拖过去,怪麻烦的。

于是我跟随Python官方教程学习了如何把python项目打包,并上传到pypi,这样在任意场合安装都能使用自己的框架: pip install {框架名称}

如果后期开源,可以让大家一起使用,同时还能迭代版本。今后,我终于不是只会pip install 其他人的包了。

2.打包方法

以下步骤仅限Unix/macOS系统,Win用户需要自行去参考官方教程[1],流程类似哈。

(1)命令行输入以下指令更新 pip 版本

python3 -m pip install --upgrade pip

(2)Github创建一个Python项目,项目名 example_project_{你的ID}

勾选README和LICENSE,LICENSE可以选择MIT,.gitignore自选,然后添加必要的文件,创建以下项目目录。

example_project_blacktear/
|—LICENSE
|—pyproject.toml
|—README.md
|-requirements.txt
|—setup.cfg
|-tests/
|—src/
|-example_project_blacktear/
|-__init__.py
|-example.py

_init_.py的作用是把 example_project_blacktear/ 变成一个python模块,方便从模块外面直接调用内部的子模块。

然后可以在example.py中添加一个简单的函数,方便后续调用测试。

def add_one(number):
return number + 1

(3)在打包文件 pyproject.toml 中添加以下内容

[build-system]
requires = [
"setuptools>=42",
"wheel"
]
build-backend = "setuptools.build_meta"

该文件告诉构建工具(如pip和build)构建你的项目需要什么,官方教程是setuptools和wheel。

(4)在静态配置文件setup.cfg中添加以下内容

[metadata]
name = example_project_blacktear
version = 0.0.1
author = blacktear
author_email = blacktear@example.com
description = A small example package
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/blacktear/example_project_blacktear
project_urls =
Bug Tracker = https://github.com/blacktear/example_project_blacktear/issues
classifiers =
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
Operating System :: OS Independent

[options]
package_dir =
= src
packages = find:
python_requires = >=3.6

[options.packages.find]
where = src

根据个人需求以及个人信息需要自定义的字段:

[name] : 后续pip install使用的包名

[version]: 版本号,后续每次上传新的版本都需要更改

[author] : 作者名

[author_email] : 作者邮箱

[url] : github项目的地址

[Bug Tracker] : github项目的issue地址

[description] : 该Python项目的描述信息

[long_description]: 该Python项目的详细描述信息,一般为README.md内容

限定内容的字段:

[classifiers] : 可以按照官方教程填写,具体参考链接 https://pypi.org/classifiers/

[long_description_content_type]: 官方只提供了以下几种类型的描述内容类型(text/plain,text/x-rst,text/markdown)

[python_requires] : 根据项目中python实际需求版本填写

(5)完善剩余文件的内容

README.md包含项目的详细文档,包括如何安装使用等,

requirements.txt填入该项目的依赖包以及对应的版本号。

(6)打包项目

命令行中输入以下指令安装船新版本的build包:

python3 -m pip install --upgrade build

进入项目的根目录,在命令行输入以下指令打包项目。

如果你后续修改了代码内容,需要重新build然后上传新版本;setup 中的版本号也需要更新,例如 0.0.1 -> 0.0.2。

python3 -m build

项目根目录中多了一个dist/目录:

dist/
-example_project-0.0.1-py3-none-any.whl
-example_project-0.0.1.tar.gz

命令行输入以下指令安装船新版本的twine包

python3 -m pip install --upgrade twine

(7)注册账户并且新建API token

在https://test.pypi.org或者https://pypi.org注册个人账户,注册完后,上传包的过程中需要输入用户名和密码。

需要注意的是,官方提供的上传包方式是PyPI的API token形式,因此用户名是__token__,密码是创建的API token。

进入pypi的个人账户设置(account settings),找到API tokens栏,点击Add API token

用了Python这么久,你连这个都没试过?_python_02

填写Token name(可以是包的名字),scope选择“Entire account”,点击Add token


用了Python这么久,你连这个都没试过?_git_03

生成API token后,切记要保存起来。因为只显示一次!


用了Python这么久,你连这个都没试过?_项目管理_04

(8)上传项目

在命令行的项目根目录下输入以下指令上传打包文件到pypi(这里因为是测试,所以上传到个人的testpypi)。

python3 -m twine upload --repository testpypi dist/*

如需正式发布,需修改为以下指令:

python3 -m twine upload --repository pypi dist/*

然后输入刚才通过API token获取的用户名和密码:

Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
Enter your password:“刚才生成的API token内容”
Uploading example-project-0.0.1-py3-none-any.whl
100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example-project-0.0.1.tar.gz
100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]

上传成功后,就可以安装刚刚发布的包了!

pip install -i https://test.pypi.org/simple/ example-project-blacktear

用了Python这么久,你连这个都没试过?_github_05

3.打包代码遇到的问题

(1)如何从包名直接导入内部函数或者类

目前调用add_one()必须要先import example,再调用

from example_package_blacktear import example
example.add_one(2)

如果想安装后直接从外部包名导入内部的add_one()函数,可以在__init__.py中添加以下内容:

from .example import *

然后就可以直接从外部导入内部函数。

from example_package_blacktear import add_one
add_one(2)

(2)静态和动态配置文件

官方教程提供了两种配置文件setup.cfg(静态)和setup.py(动态),推荐的是setup.cfg。

静态文件上面已给出实例,动态文件格式可以在官方教程页面找到。

4.小结

打包过程还是比较繁琐的,有些地方容易踩坑,然后一直报错。

但是操作了一遍后,熟能生巧,后续会越来越熟悉灵活。

以上所有步骤我们都做了实测,参考这篇推文,你可以顺利打包自己的专属Python项目,并让其他人调用。

当有人问到,你的框架解决那个bug了吗?你可以酷酷地说:哦?那个啊,我已经发布新的1.2.3版本了,重新安装即可~

- END -


Reference

1.https://packaging.python.org/tutorials/packaging-projects/

用了Python这么久,你连这个都没试过?_python_06

原创不易,有收获的话请帮忙点击分享、点赞、????