簡體   English   中英

從 conda 環境導出頂級依賴項,包括 pip 安裝

[英]Exporting top level dependencies from conda environment including pip installations

如果我執行conda env export --from-history -f environment.yml我會得到我安裝的所有頂級依賴項,但我不會得到我通過pip安裝的包。 另一方面,如果我使用conda env export -f environment.yml ,我會獲得pip包以及所有依賴項(而不僅僅是頂級的)。 有沒有辦法導出以便我獲得頂級依賴項,包括pip包?

當前的 CLI 中沒有任何東西可以做到這一點。

正如@Peter 提到的,最簡單的方法可能是導出兩者並手動復制- pip:部分。 另一種選擇是執行--from-history導出,然后pip freeze > requirements.txt 然后可以添加requirements.txt如本答案所示

來自@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_PATH (可以通過運行命令whereis conda )。

然后運行如下:

python conda_export_minimal.py --s_save=env.yml

一個新文件env.yml將出現在您的當前目錄中,其中包含有關 conda 和 pip 的最小依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM