python - 从 conda 环境导出顶级依赖项,包括 pip 安装

标签 python pip anaconda

如果我这样做conda env export --from-history -f environment.yml我获得了安装的所有顶级依赖项,但没有获得通过 pip 安装的软件包。另一方面,如果我使用 conda env export -f environment.yml ,我得到pip包以及所有依赖项(而不仅仅是顶级依赖项)。有没有办法导出,以便我获得顶级依赖项,包括 pip包?

最佳答案

来自@ gwerbin的解决方案

我最近发现了一个用于此目的的脚本,这里是代码的链接。 conda_env_export.py


由于代码很短,我可以粘贴下面的代码。请注意,我修改了一些地方供我个人使用。

import re
import subprocess
import sys
import yaml
import fire


CONDA_PATH = '/home/ubuntu/miniconda3/condabin/conda'


def export_env(history_only=False):
    cmd = [CONDA_PATH, 'env', 'export']
    if history_only:
        cmd.append('--from-history')

    cp = subprocess.run(cmd, stdout=subprocess.PIPE)
    try:
        cp.check_returncode()
    except:
        raise
    else:
        return yaml.safe_load(cp.stdout)


def _is_history_dep(d, history_deps):
    if not isinstance(d, str):
        return False
    d_prefix = re.sub(r'=.*', '', d)
    return d_prefix in history_deps


def _get_pip_deps(full_deps):
    for dep in full_deps:
        if isinstance(dep, dict) and 'pip' in dep:
            return dep


def _combine_env_data(env_data_full, env_data_hist):
    deps_full = env_data_full['dependencies']
    deps_hist = env_data_hist['dependencies']
    deps = [dep for dep in deps_full if _is_history_dep(dep, deps_hist)]

    pip_deps = _get_pip_deps(deps_full)

    env_data = {}
    env_data['channels'] = env_data_full['channels']
    env_data['dependencies'] = deps
    env_data['dependencies'].append(pip_deps)

    return env_data


def main(s_save=None):
    env_data_full = export_env()
    env_data_hist = export_env(history_only=True)
    env_data = _combine_env_data(env_data_full, env_data_hist)
    if s_save:
        with open(s_save, 'w') as y:
            yaml.dump(env_data, y)
    else:
        yaml.dump(env_data, sys.stdout)


if __name__ == '__main__':
    fire.Fire(main)

教程

将上面的代码保存为conda_export_minimal.py

指定 CONDA_PATH 为您的 conda 路径(可以通过运行命令 whereis conda 找到)。

然后运行如下:

python conda_export_minimal.py --s_save=env.yml

一个新文件 env.yml 将出现在当前目录中,其中包含有关 conda 和 pip 的最小依赖项。

关于python - 从 conda 环境导出顶级依赖项,包括 pip 安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69401364/

相关文章:

python - python中的凯撒密码

python - 在没有 C++ 编译器的情况下安装 python 包

installation - 来自virtualenv中 'pip list'的声明错误。

python - 在 sqlalchemy 查询中使用 jsonb_array_elements

python - 如何让 Bokeh 的 'PointDrawTool' 与 NetworkX Spring_Layout 一起使用

python - 如何使用 Python 连接到本地 MQseries 队列?

python - pip 没有得到当前版本

python - 如果谷歌云断开连接如何恢复anaconda环境

python - 无法嵌入 Bokeh 图

Mac OS X (El Capitan) 上 MySQLdb 的 Python ImportError