对于Python开发者来说,写好代码并不是唯一的步骤,还需要将代码打包成模块,并且加上依赖关系。这样其他开发者在使用你的模块时就可以更方便地调用并且避免重复造轮子。Python的标准库中提供了setuptools,通过setup.py脚本可以制作出一个可发布的Python模块并且管理依赖关系。
一、创建setup.py文件
要使用setuptools创建一个可发布的Python模块,首先在项目根目录下创建一个名为setup.py的文件。setup.py文件是用来描述Python模块如何安装、构建以及打包的脚本,简单来说就是模块的说明书。
from setuptools import setup, find_packages
setup(
name='example', # 模块名
version='0.1', # 版本号
packages=find_packages(), # 包含的包
install_requires=['numpy>=1.16.6', 'pandas>=0.24.2'], # 依赖的第三方库
test_suite='nose.collector',
tests_require=['nose'],
entry_points={
'console_scripts': [
'example = example.app:start'
]
},
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
)
这里导入了setuptools的setup()函数和find_packages()函数。setup()函数的参数包含了很多可以设置的选项,例如模块名、版本号、包含的包、依赖关系、可执行文件等。
二、设置版本号
版本号是一个Python模块最重要的元素之一。通过给模块设置版本号,可以使你的代码与其他依赖关系和版本号兼容的代码一起工作,还可以根据需要更轻松地追踪和管理你的代码的进展。
设置版本号的通常方式是修改setup.py文件中的version参数,如下所示:
setup(
name='example',
version='0.1',
# ...
)
版本号通常由两个逻辑部分构成:主版本号和次版本号。主版本号通常表示代码中引入了重大变化或不向后兼容的更改,而次版本号通常表示一些小的增强、重构或者错误修复。
三、依赖管理
依赖管理是打包Python模块时必不可少的一部分。一般来说,一个Python模块可能会依赖于其他的第三方模块,这些模块需要在安装前先安装。
可以在setup.py的install_requires选项中声明你的Python模块的依赖项,例如:
setup(
name='example',
version='0.1',
install_requires=['numpy>=1.16.6', 'pandas>=0.24.2'],
# ...
)
这里声明了numpy和pandas两个第三方库的依赖,且要求版本号不低于某个值。
四、生成可执行文件
有时,一个Python模块可以生成可执行文件。例如,一些工具可以在命令行中运行,而不是直接运行Python代码。在Python中,可以使用setuptools的entry_points选项来定义一个可执行文件。
下面是一个例子:
setup(
name='example',
version='0.1',
# ...
entry_points={
'console_scripts': [
'example = example.app:start'
]
},
# ...
)
这里,我们将example.app:start作为可执行文件的入口点。一旦模块被安装,用户就可以运行example作为命令,并调用到example模块的start()函数。
五、构建和发布Python模块
在设置好setup.py文件后,可以使用setuptools来构建和发布Python模块了。要构建模块,请在命令行中进入包含setup.py文件的目录,并执行以下命令:
python setup.py sdist
这将创建一个源分发包(.tar.gz)。如果同时也想为其他操作系统和Python版本构建二进制分发包(.whl),可以使用以下命令:
python setup.py bdist_wheel
最后,通过如下命令上传分发包到PyPI:
twine upload dist/*
其中,twine是PyPI官方的上传工具。在执行此命令前,请确保你已在PyPI上注册了帐户。
六、总结
Python的setuptools是一个非常方便的打包工具,不仅能够管理依赖关系,还能方便地发布Python模块。一个好的Python模块应该是易于安装、易于调用,而设置好的setup.py文件就是实现这些目标的重要一环。