Packaging a Python project

Packaging 的相关内容/用法

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

https://packaging.python.org/guides/distributing-packages-using-setuptools/

https://packaging.python.org/

 

Packaging 的 tutorial

https://python-packaging.readthedocs.io/en/latest/index.html

 https://python-packaging-tutorial.readthedocs.io/en/latest/setup_py.html

https://blog.ionelmc.ro/2014/05/25/python-packaging/    //这篇blog对于Python project 的 structure 有详细说明

 

开始一个Python package

sampleproject是一个比较好的开始一个python project的template,推荐大家使用它: https://github.com/pypa/sampleproject。

 

Package的基本步骤

1. 准备好代码,以及合理的目录结构

2. 编写配置文件,使用setuptools(或者distutils)一般情况下都是使用setup.py(setup.cfg一般配置setup.py的command相关的参数),其中的配置项和参数具体参考这里

3. 打包

python setup.py sdist
python setup.py bdist_wheel //打wheel 包

4. 上传pypi或者私有artifactory 比如Jfrog.

 

Future packaging

传统的打包方式是使用setuptools(distutils),但是PEP517和PEP518一起引入了新的打包方式。PEP518引入了新的配置文件pyproject.toml, PEP517引入了新的配置项,可以在pyproject.toml中配置打包工具相关内容(比如使用其他打包工具flit)。

 

我在打包过程中的pitfalls

 1. __init__.py 

在__init__.py中尽量保持简洁,不推荐把main()放在__init__.py中(https://github.com/pypa/sampleproject就是这么做的),在__init__.py中可以定义__all__,这样在使用

from pkg import *

的时候,就会import所有定义在__all__中的object,一个例子:

__all__ = [
    "__version__",
    "ClassName1",
    "ClassName2",
    ...
]

如果不指定的话,import *一般不会把package里面的所有内容都import 进来。

另外,在__init__.py中可以定义__version__,这样的话安装好Package之后可以使用pkg.__version__来获取这个包的版本号。比如在使用setuptools_scm自动版本管理时,我们可以在__init__.py中定义如下__version__:

from pkg_resources import get_distribution
__version__ = get_distribution(__name__).version

 

2. __main__.py

在package中的__main__.py中一般放置main()函数的调用或者package主要cli的入口,这样可以让package能够使用'python -m pkg'命令,详细这里

 

3. version的管理推荐使用setuptools_scm

https://pypi.org/project/setuptools-scm/

 

posted @ 2020-09-25 15:56  LCdre  阅读(200)  评论(0编辑  收藏  举报