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

2021-09-15 00:00:00 项目 指令 打包 官方 上传

众所周知,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

填写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。

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

4.小结

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

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

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

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

- END -


以上文章来源于NLP情报局 ,作者黒淚  


相关文章