用了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
[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
根据个人需求以及个人信息需要自定义的字段:
(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
填写Token name(可以是包的名字),scope选择“Entire account”,点击Add token
生成API token后,切记要保存起来。因为只显示一次!
(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
|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example-project-0.0.1.tar.gz
|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]
上传成功后,就可以安装刚刚发布的包了!
pip install -i https://test.pypi.org/simple/ example-project-blacktear
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。
静态文件上面已给出实例,动态文件格式可以在官方教程页面找到。
打包过程还是比较繁琐的,有些地方容易踩坑,然后一直报错。
但是操作了一遍后,熟能生巧,后续会越来越熟悉灵活。
以上所有步骤我们都做了实测,参考这篇推文,你可以顺利打包自己的专属Python项目,并让其他人调用。
当有人问到,你的框架解决那个bug了吗?你可以酷酷地说:哦?那个啊,我已经发布新的1.2.3版本了,重新安装即可~
- END -
以上文章来源于NLP情报局 ,作者黒淚
相关文章