pip 安装environment.yml,就好像它是requirements.txt

问题描述 投票:0回答:5

我有一个

environment.yml
文件,但不想使用 Conda:

name: foo
channels:
  - defaults
dependencies:
  - matplotlib=2.2.2

是否可以让

pip
environment.yml
文件中安装依赖项,就好像它是
requirements.txt
文件一样?

我尝试了

pip install -r environment.yml
,但它不适用于
pip==22.1.2

python pip conda python-packaging requirements.txt
5个回答
13
投票

基于Beni实现,我只是想调整代码,因为它有很多错误;

import os
import yaml

with open("environment.yaml") as file_handle:
    environment_data = yaml.safe_load(file_handle)

for dependency in environment_data["dependencies"]:
    if isinstance(dependency, dict):
      for lib in dependency['pip']:
        os.system(f"pip install {lib}")

6
投票

不,

pip
不支持这种格式。需求文件所需的格式记录在here。您必须手动或通过自动执行此过程的脚本将
environment.yml
文件转换为
requirements.txt
格式。但是,请记住,并非 Conda 上的所有软件包都可以在 PyPI 上使用。


6
投票

我已经实现了 Brian 在他的评论中建议的内容。

这会将

environment.yaml
转换为
requirements.txt
:

import yaml

with open("environment.yaml") as file_handle:
    environment_data = yaml.load(file_handle)

with open("requirements.txt", "w") as file_handle:
    for dependency in environment_data["dependencies"]:
        package_name, package_version = dependency.split("=")
        file_handle.write("{} == {}".format(package_name, package_version))

这会直接使用

pip
安装依赖项:

import os
import yaml

with open("environment.yaml") as file_handle:
    environment_data = yaml.load(file_handle)

for dependency in environment_data["dependencies"]:
    package_name, package_version = dependency.split("=")
    os.system("pip install {}=={}".format(package_name, package_version))

注意:为了简单起见,我省略了错误处理和包定义的任何其他变体(例如,大于或等于某个版本的包版本的规范)。


5
投票

第一个答案提出了重要的一点:没有直接转换,因为 Conda 是通用包管理器,因此包含其他包。此外,Conda 包通常可以有不同的名称。所提出的解析解决方案均未涵盖这种情况。

我个人认为最有效的

完整方法是用Mamba重新创建环境,然后在环境中使用pip

转储出合法的
requirements.txt

# use mamba, not conda mamba env create -n foo -f environment.yaml mamba install -yn foo pip mamba run -n foo pip list --format freeze > requirements.txt mamba env remove -n foo
也就是说,不要想太多并使用手头的可靠工具。


0
投票
如果您不想使用脚本,我已使用以下单行代码从 env.yml 文件生成requirements.txt 文件:

❯ grep -n "pip:" env.yml | cut -d":" -f1 | xargs -I{} expr {} + 1 | xargs -I{} tail -n +{} env.yml | sed 's/^[[:space:]]*- //' | cut -d"=" -f 1 > requirements.txt
这只是获取 yml 中 

pip

 依赖项下的所有依赖项,并删除 pip 自行处理的固定版本。

© www.soinside.com 2019 - 2024. All rights reserved.