【问题标题】:Exporting top level dependencies from conda environment including pip installations从 conda 环境导出顶级依赖项,包括 pip 安装
【发布时间】:2021-11-22 20:02:44
【问题描述】:

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

【问题讨论】:

  • 手动将它们添加到你的 yml 怎么样?如果你总是更喜欢 conda 而不是 pip 安装,那么就不应该有很多。

标签: python pip anaconda


【解决方案1】:

当前 CLI 中没有任何东西可以做到这一点。

正如@Peter 所提到的,将两者都导出并手动复制- pip: 部分可能是最简单的。另一种选择是先导出--from-history,然后再导出pip freeze > requirements.txt。然后可以添加requirements.txt as in this answer

【讨论】:

    【解决方案2】:

    来自@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 路径指定CONDA_PATH(可以通过运行命令whereis conda 找到)。

    然后运行如下:

    python conda_export_minimal.py --s_save=env.yml
    

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

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2021-10-05
      • 2017-04-18
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多