我有一个
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
。
基于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}")
不,
pip
不支持这种格式。需求文件所需的格式记录在here。您必须手动或通过自动执行此过程的脚本将 environment.yml
文件转换为 requirements.txt
格式。但是,请记住,并非 Conda 上的所有软件包都可以在 PyPI 上使用。
我已经实现了 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))
注意:为了简单起见,我省略了错误处理和包定义的任何其他变体(例如,大于或等于某个版本的包版本的规范)。
第一个答案提出了重要的一点:没有直接转换,因为 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
也就是说,不要想太多并使用手头的可靠工具。
❯ 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 自行处理的固定版本。