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

img

语法格式:

  • 注释与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类似,可以使用<、>、<=、> =、==等运算符后跟版本标识符。当项目安装时会根据该配置来下载和安装依赖。

参考:https://zhuanlan.zhihu.com/p/480534599

posted @ 2023-06-22 22:25  kirin-dev  阅读(391)  评论(0编辑  收藏  举报