众所周知,Python如此好用的一个重要原因是有很多优秀的第三方库,例如numpy,pandas,tqdm,transformers,torch等等。
本文将手把手带领大家把代码打包成第三方库,供自己和他人使用。
1.打包初衷
最近由于项目需要,我把以前的比赛代码做了重构,并写了一套训练框架。使用这套框架时,我意识到:如果在其他项目中沿用这套框架,还得先把代码库拖过去,怪麻烦的。
于是我跟随Python官方教程学习了如何把python项目打包,并上传到pypi,这样在任意场合安装都能使用自己的框架: pip install {框架名称}
如果后期开源,可以让大家一起使用,同时还能迭代版本。今后,我终于不是只会pip install 其他人的包了。
2.打包方法
以下步骤仅限Unix/macOS系统,Win用户需要自行去参考官方教程[1],流程类似哈。
(1)命令行输入以下指令更新 pip 版本
(2)Github创建一个Python项目,项目名 example_project_{你的ID}
勾选README和LICENSE,LICENSE可以选择MIT,.gitignore自选,然后添加必要的文件,创建以下项目目录。
_init_.py的作用是把 example_project_blacktear/ 变成一个python模块,方便从模块外面直接调用内部的子模块。
然后可以在example.py中添加一个简单的函数,方便后续调用测试。
(3)在打包文件 pyproject.toml 中添加以下内容
该文件告诉构建工具(如pip和build)构建你的项目需要什么,官方教程是setuptools和wheel。
(4)在静态配置文件setup.cfg中添加以下内容
根据个人需求以及个人信息需要自定义的字段:
[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包:
进入项目的根目录,在命令行输入以下指令打包项目。
如果你后续修改了代码内容,需要重新build然后上传新版本;setup 中的版本号也需要更新,例如 0.0.1 -> 0.0.2。
项目根目录中多了一个dist/目录:
命令行输入以下指令安装船新版本的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)。
如需正式发布,需修改为以下指令:
然后输入刚才通过API token获取的用户名和密码:
上传成功后,就可以安装刚刚发布的包了!
3.打包代码遇到的问题
(1)如何从包名直接导入内部函数或者类
目前调用add_one()必须要先import example,再调用
如果想安装后直接从外部包名导入内部的add_one()函数,可以在__init__.py中添加以下内容:
然后就可以直接从外部导入内部函数。
(2)静态和动态配置文件
官方教程提供了两种配置文件setup.cfg(静态)和setup.py(动态),推荐的是setup.cfg。
静态文件上面已给出实例,动态文件格式可以在官方教程页面找到。
4.小结
打包过程还是比较繁琐的,有些地方容易踩坑,然后一直报错。
但是操作了一遍后,熟能生巧,后续会越来越熟悉灵活。
以上所有步骤我们都做了实测,参考这篇推文,你可以顺利打包自己的专属Python项目,并让其他人调用。
当有人问到,你的框架解决那个bug了吗?你可以酷酷地说:哦?那个啊,我已经发布新的1.2.3版本了,重新安装即可~
- END -
Reference
1.https://packaging.python.org/tutorials/packaging-projects/
原创不易,有收获的话请帮忙点击分享、点赞、????