Python构建自己的函数包

大家使用Python经常会根据自己的目的写一些常用的函数,来实现代码复用,但是如果不想在每个代码中都把函数写一遍,就需要创建自己的包,这样每次import就好了,用起来非常方便,有时只有自己用的话在本地随便写写就好了,如果要共享给他人,就需要传到pypi,虽然网上有很多教程了,但是我还是踩了很多坑,下面就来介绍一下到底该怎么实现吧。

构建自己的包

注册账号

首先需要去pypi(https://pypi.org/)和testpypi(https://test.pypi.org/)分别注册账号,pypi是最终发布用的,testpypi是测试用的,账号和密码可以不同。
然后在自己的根目录下,一般就是打开cmd的地方,创建.pypirc文件,添加以下代码,这样每次上传包就不需要密码了:

[distutils]
index-servers =
  pypi
  pypitest

[pypitest]
repository = https://test.pypi.org/legacy/
username: username
password: password

[pypi]
repository = https://upload.pypi.org/legacy/
username: username
password: password

创建文件结构

Python构建自己的函数包_第1张图片
第一步是先新建一个文件夹(比如packaging_tutorial),然后按照下图创建各种文件。
(1)LICENSE,这里一般用来说明这个文档是公开的,一般直接复制粘贴
(2)pyproject.toml,这个用来说明构建这个包需要的工具,一般也没啥
(3)README.md,readme文件
(4)setup.cfg,这个文件在很多百度教程里是setup.py,都是一样的,但是现在官方推荐使用.cfg
(5)src,就是source code的缩写啦,这里需要非常注意的是你在setup.cfg里的name必须和example_package一致,这样才能保证包的正常安装,我在这一步踩了好多坑。_init_.py文件写成空的即可,这个文件的目的就是告诉Python和这个文件在同一个文件目录下的.py文件是Python-package,example.py就是你自己代码需要写进的文件了,这里需要注意example就是你库的名字了,比如这里如果要import就得用

from example_package import example

(6)最后这个test文件没啥用,官方文档说后面可能用得到。
具体的文件写法请见:
https://packaging.python.org/en/latest/tutorials/packaging-projects/
里面写的还是很详细的

创建轮子和压缩包

这一步需要安装build:

pip install --upgrade build

然后运行:

python -m build

这样就会在packaging_tutorial文件夹里出现一个新文件夹dist,里面有一个.whl和一个.tar.gz文件,.whl文件就是Python包的安装文件,.tar.gz文件包含发布版原始源代码的归档文件,一般来说只需要.whl就可以了,不过我们还是都上传了。

上传

一般来说我们先上传到testpypi,因为一旦上传到pypi,就会更新新的版本号,所以还是先test一下 (没有安装twine的先pip install twine):

twine upload --repository pypitest dist/*

之后就可以在自己的电脑上安装看看效果了:

pip install --index-url https://test.pypi.org/simple/ --no-deps example_package 

如果没问题,就可以用下面的代码正式上传:

twine upload dist/*

安装就正常安装,你也可以在pypi网页里看到自己的包了

pip install example_package 

如果这两步出现了输入密码,你可以选择输入密码,也可以返回第一步看看.pypirc文件哪里配置错了.
以上代码我是在windows环境下运行无误的,mac和linux可以再看看上面的官方链接,应该都差不多。
开始自由使用自己的包吧~

更新包

如果我们要更改我们的包,就把代码更改完成后首先修改setup.cfg里的版本号,
然后运行:

python -m build

下一步删除…/dist 里面老版本的tar.gz和.whl文件,最后:

twine upload dist/*

可能出现的bug

首先是自己写函数代码的时候,如果不想使用from package import function的话,可以通过更改__int__.py文件来实现,具体教程别人已经写的比较清楚了,这里就不再赘述。
简单来说就是在int文件里先把各个关系import好,注意如果想要在不同.py文件之间互相调用函数,需要import package.function,而不能直接import function,不然会找不到,如果强行添加路径,会报循环导入的错误。

你可能感兴趣的:(Python,python)