Python requirements.txt & setup.py
Python项目依赖项管理工具
Python官方定义:
install_requires(即setup.py)定义了单个项目的依赖关系,而requirements.txt通常用于定义完整Python环境。
- 共性:都可以用于管理python项目的依赖项
- 区别:requiremens.txt只列举Python项目中的所有依赖项及其特定版本。setup.py这个文件是用来管理模块的,可以将项目打包为模块上传到pypi中,也同样能将项目作为模块放入python的系统加载模块目录下,主要声明项目的元数据,例如包名、版本、依赖项、入口点等。
如何选择?
- 如果主要用于项目开发目的,并且不打算发布到pypi上,则requirements.txt就足够了(即使该包是在多台机器上开发的)
- 如果包仅在单机开发,但是需要把他作为pip的包发布到pypi上,那么setup.py/setup.cfg就足够了。
- 如果包是在多台机器上开发的并且还需要把他发布到pypi上,这就需要requirements.txt(多个机器需要相同的开发环境)和setup.py/setup.cfg文件(发布到pypi上)。
requirements.txt
指定项目的依赖包和版本
生成确切版本(==)(一般在项目根目录中):
pip freeze > requirements.txt
部署:
pip install -r requirements.txt
语法格式:
- 注释与python注释格式一致
- 不指定版本号,则默认安装最新版本
- ==:等于
- >:大于版本
- >=:大于等于版本
- <:小于版本
- <=:小于等于版本
- ~=:兼容版本,大于或等于指定版本且不大于当前发行系列的版本
- 使用逗号分隔两个条件,表示同时满足,eg:
package_name >= 1.0, <=2.0
默认情况下会列出环境中所有package及其版本(无论是否在项目中引入)。如果希望requirements.txt文件变得精简,可以使用虚拟环境实现隔离(virtualenv、pipenv),为每个单独的python项目生成特定的requirements.txt文件。
setup.py
setuptools是构建在distutils之上的包,它可以帮助开发人员快速发布Python包。除此以外它还提供了使依赖管理更容易的功能。
当想要发布一个包时,通常需要填写一些元数据,例如包名、版本、依赖项、入口点等。setuptools就提供了简化这些操作的功能。
项目的元数据等信息需要在setup.py文件中定义:
from setuptools import setup
setup(
name='demo',
author='kirin-dev',
version='1.0',
install_requires=[
'matplotlib',
'numpy',
'pandas',
'Pillow',
'PyNaCl',
'seaborn',
'tqdm',
],
# ... more options/metadata
)
填写的信息都是纯声明性的,所以一个更好的方法是在名为setup.cfg的文件中定义这些元数据和信息,然后只需在setup.py文件中调用setup()即可,setup.cfg示例如下所示:
[metadata]
name = demo
author = kirin-dev
version = 1.0
[options]
install_requires =
matplotlib,
numpy,
pandas,
Pillow,
PyNaCl,
seaborn,
tqdm,
这样setup.py文件中只需要保留最少的代码:
from setuptools import setup
if __name__ == "__main__":
setup()
上面install_requires参数与requirements.txt类似,可以使用<、>、<=、> =、==等运算符后跟版本标识符。当项目安装时会根据该配置来下载和安装依赖。