Python库安装之requirements.txt, environment.yml

目录

1. 前言

2. requirements.txt

2.1 生成和使用命令

2.2 内容

3. environment.yml

3.1 常见问题

4. 总结

4.1 yml or yaml?


1. 前言

        最近安装了一些从github上clone下载的开源python软件包,经历了许许多多的酸甜苦辣。

        在python软件包,通常都会包含requirements.txt, environment.yml, setup.py三者之中某些或者全部,一开始完全不知道都是啥东东,通常都是遵照安装指示傻傻地一步一步走。但是久病成医,查阅了一些网上相关的资源逐渐也(自以为)明白了它们是咋回事。本文做一个简单的总结,不过这些只是小白的入门级的求生指南总结(所以不会包含高级使用相关的内容),如有错漏偏误欢迎指正^-^

        简而言之,requirements.txt, environment.yml是同一类的东西,它们提供的是当前软件包安装运行所需要的环境或者依赖信息,即这些东西的安装是当前软件包安装和运行的前提条件。这些信息相当于是开发者给使用者提供的用于恢复自己开发时的环境的信息。

        setup.py跟以上两者是完全不一样的,它就是用于安装当前软件包自身的安装脚本。这个要更加复杂一些,不在本文描述范围。
 

2. requirements.txt

2.1 生成和使用命令

        requirements.txt的生成(开发者写的)用pip freeze命令,安装时使用也需要用pip命令,pip生成的requirements.txt用conda install无法识别。如下例所示:

pip freeze > requirements.txt # 生成requirements.txt

pip install -r requirements.txt # 从requirements.txt安装依赖

2.2 内容

        以下为一个(我正在鼓捣的一个包的)requirements.txt示例,当然这里并没有包含requirements.txt所有可能的语法要素(一般的像我这样的菜鸟也管不了这些),知道以上两个命令在大部分情况下足以生活自理了^-^。如果用"=="的话是指定了一个特定版本的包,而用“>=”则表示只要不低于这个版本就可以了,简明易懂。至于带"-e"选项的那两行我也不懂(待查阅学习和补充)。。。^-^

gym>=0.14.0
jupyter>=1.0.0
numpy>=1.16.4
pandas>=0.24.2
scipy>=1.3.0
scikit-learn>=0.21.2
matplotlib>=3.1.0
-e git+https://github.com/ntasfi/PyGame-Learning-Environment.git#egg=ple
-e git+https://github.com/lusob/gym-ple.git#egg=gym-ple
h5py>=2.9.0
pygame>=1.9.6
tqdm>=4.32.1

        注意,“pip freeze”命令因为是提取当前环境的信息,因此所生成的requirements.txt应该都是"==",">="是(确信对应包只要不低于这个版本即可而)手动编辑修改的(我瞎猜的,待确认)。

3. environment.yml

        注:关于yml or yaml?, 参见本文最后的解释。

        environment.yml是用conda命令将环境信息导出备份的文件。

        创建命令如下:

conda env export > environment.yml

        软件安装时则执行以下命令就可以恢复其运行环境和依赖包:

conda env create -f environment.yml

        注1:.yml文件移植过来的环境只是安装了你原来环境里用conda install等命令直接安装的包,你用pip之类装的东西没有移植过来,需要你重新安装。--待确认。

        注2:environment.yml中包含该文件创建时所在的虚拟环境名称,不需要先执行"conda env create"创建并进入虚拟环境,直接在base环境下执行就会自动创建虚拟环境以及安装其中的依赖包(这个是与pip install -r requirements.txt不同的)。当然这就要求你的当前环境中没有同名的虚拟环境。如果暗装者不想使用environment.yml中内置的虚拟环境名(在environment.yml的第一行),可以使用-n选项来指定新的虚拟环境名,如下所示:

conda env create -f environment.yml -n new_env_name

        environment.yml长得什么样子呢?如下是一个示例:

3.1 常见问题

        在使用以上命令恢复环境时常见的两个问题:

        1:Warning: you have pip-installed dependencies in your environment file, but you do not list pip itself as one of your conda dependencies.

        解决办法:在yml文件中添加pip依赖,即在yml文件中添加如下行:

        - pip
 

        2:CondaValueError: prefix already exists: ......

        这个就是上面所说的yml中所含的虚拟环境名与当前既存虚拟环境名冲突了,有两种解决方法,其一是直接修改yml文件中第一行的虚拟环境名,其二是如上所示在命令行用-n指定新的虚拟环境名。

4. 总结

        简而言之,conda的.yml提供的信息比pip的requirements.txt提供的信息更完整,所以如果是使用conda进行开发和安装的话,当然应该优先选择conda的,yml.

4.1 yml or yaml?

        有些时候你看到的不是yml后缀,而是yaml后缀,那它们有没有什么不同呢?

        参见:symfony - What is the difference between .yaml and .yml extension? - Stack Overflow

        看上去,结论是它们没有什么区别,瓶子里的酒都是相同的,都是YAML格式的内容。使用yml有历史原因以及“懒人”们的(用更短一点的后缀名的)习惯使然^-^。

猜你喜欢

转载自blog.csdn.net/chenxy_bwave/article/details/121187923