【问题标题】:How do I find the name of the conda environment in which my code is running?如何找到运行我的代码的 conda 环境的名称?
【发布时间】:2016-08-01 01:54:45
【问题描述】:

我正在寻找一种从正在运行的代码或交互式 python 实例中找出我所在的 conda 环境名称的好方法。

用例是我正在运行 Jupyter 笔记本,同时使用来自 miniconda 安装的 Python 2 和 Python 3 内核。默认环境是 Py3。 Py2 有一个单独的环境。在笔记本文件中,我希望它尝试conda install foo。我现在使用subcommand 来执行此操作,因为我找不到与pip.main(['install','foo']) 等效的程序化 conda。

问题是,如果笔记本使用 Py2 内核运行,该命令需要知道 Py2 环境的名称才能在那里安装foo。如果没有该信息,它将安装在默认的 Py3 环境中。我想让代码自己弄清楚它所在的环境以及正确的名称。

到目前为止,我得到的最佳解决方案是:

import sys

def get_env():
    sp = sys.path[1].split("/")
    if "envs" in sp:
        return sp[sp.index("envs") + 1]
    else:
        return ""

有没有更直接/更合适的方式来实现这一点?

【问题讨论】:

  • 除非我弄错了,conda install x 将安装到当前环境中:所以如果笔记本在 Python 2 环境中,那么它将安装到该环境中。
  • 我刚刚尝试了以下实验。在从我的默认 anaconda 环境启动的 Jupyter 笔记本中(但同时提供 Py2 和 Py3 ipython 内核),我在一个单元格中运行 !conda env list,在另一个单元格中运行 import subprocess; print(subprocess.check_output(['conda','env', 'list']).decode())。无论我在 Py2 还是 Py3 中运行笔记本,两者都显示默认环境处于活动状态,因此可能是针对操作系统发出的命令在启动 jupiter 服务器使用的任何环境中运行。
  • 我需要一些更简单的东西,如何找出你从 shell 运行的 conda env? (旁注你可以从 python 调用该命令)
  • 回答我自己的评论conda env list* 指向当前打开的环境。我这样做的原因是尽管名称出现在终端名称提示中,但当提示与我正在使用的环境不匹配时(例如使用 vscode)我遇到了问题。
  • 如果您想要绝对路径,请执行$ echo $CONDA_PREFIX 参见输出:/home/miranda9/miniconda3/envs/metalearning

标签: python anaconda jupyter conda env


【解决方案1】:

对于通常更有用的绝对完整路径:

Python 3.9.0 | packaged by conda-forge | (default, Oct 14 2020, 22:56:29) 
[Clang 10.0.1 ] on darwin
import os; print(os.environ["CONDA_PREFIX"])
/Users/miranda9/.conda/envs/synthesis

【讨论】:

    【解决方案2】:

    你想要$CONDA_DEFAULT_ENV$CONDA_PREFIX

    $ source activate my_env
    (my_env) $ echo $CONDA_DEFAULT_ENV
    my_env
    
    (my_env) $ echo $CONDA_PREFIX
    /Users/nhdaly/miniconda3/envs/my_env
    
    $ source deactivate
    $ echo $CONDA_DEFAULT_ENV  # (not-defined)
    
    $ echo $CONDA_PREFIX  # (not-defined)
    

    在python中:

    In [1]: import os
       ...: print (os.environ['CONDA_DEFAULT_ENV'])
       ...:
    my_env
    

    对于通常更有用的绝对完整路径:

    Python 3.9.0 | packaged by conda-forge | (default, Oct 14 2020, 22:56:29) 
    [Clang 10.0.1 ] on darwin
    import os; print(os.environ["CONDA_PREFIX"])
    /Users/miranda9/.conda/envs/synthesis
    

    环境变量没有很好的记录。你可以找到这里提到的CONDA_DEFAULT_ENVhttps://www.continuum.io/blog/developer/advanced-features-conda-part-1

    我能找到的关于CONDA_PREFIX 的唯一信息是这个问题: https://github.com/conda/conda/issues/2764

    【讨论】:

    • Python 解决方案不适用于 py3,因为...括号...对于 py3:
    • 打印(os.environ['CONDA_DEFAULT_ENV'])
    • 优秀。我只想补充一点,source deactivate 已弃用,现在您必须使用conda deactivate
    • 但这不是整个路径,只是头部的名称....像 /home/miranda9/miniconda3/envs/metalearning 这样的东西是我想要的。 import os; print(os.environ["CONDA_PREFIX"]) 也是如此
    【解决方案3】:
    conda info
    

    直接列出第一行可以看到的所有信息

    active environment: (some name)
    active env location: (location of active environment)
    

    我想这是最清楚的方法。

    在像 Jupyter Notebook 或 Jupyter Lab 这样的交互式环境中,您应该在键入命令之前使用 %,如下所示,

    %conda info
    

    【讨论】:

      【解决方案4】:
      1. 有几个答案建议使用“which pip”、“which python”或“conda env list to grep the default”。如果用户正在执行以下操作,则此工作: $ conda 激活环境名称; $ python ... 或 $ jupyter notebook/jupyterlab.

      2. 当用户在没有 conda activate 的情况下直接调用 python 时,方法 #1 将不起作用:例如$ /opt/conda/envs/my_env/bin/python(其中 my_env 是 env 的名称)

      3. 在使用 jupyter notebook 的更一般情况下,可以选择任何一个可用的 conda env/kernel,并且选择的可能与默认值不同。

      4. 因此,解决方案是检查您当前 python 的可执行文件或路径,就像几个人之前发布的那样。基本上,sys.path 返回可执行文件的完整路径,然后可以使用 split 找出 envs/ 之后的名称,即 env_name。问这个问题的人给出了一个很好的答案,除了错过这个......

      5. 我认为没有任何帖子处理过基本环境的特殊情况。注意基本环境中的 python 只是 /opt/conda/bin/python。所以可以简单地添加以下代码片段进行匹配 如果 /opt/conda/bin/python 在 sys.path 中: 返回“基地”

      6. 这里我们假设 conda 安装在 /opt/conda 上。对于真正通用的解决方案,可以使用 $ conda info --root 来查找安装路径。

      【讨论】:

        【解决方案5】:

        在 Windows 上(可能在 Linux 上工作但未经测试):

        import sys
        import os
        
        # e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
        print( sys.exec_prefix.split(os.sep)[-1] )
        

        使用环境变量或假设路径分隔符为“/”的答案在我的 Windows/Anaconda3 环境中不起作用。

        这假设你在一个环境中。

        【讨论】:

          【解决方案6】:

          我正在使用这个:

          import sys
          sys.executable.split('/')[-3]
          

          它的优点是它不假定环境在路径中(并且嵌套在envs 下)。此外,它不需要通过source activate 激活环境。

          编辑:如果您想确保它也可以在 Windows 上运行:

          import sys
          from pathlib import Path
          Path(sys.executable).as_posix().split('/')[-3]
          

          澄清一下:sys.executable 为您提供当前 python 解释器的路径(不管激活/停用)——例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'。其余代码只取最后一个路径段的第三个,即环境所在文件夹的名称,通常也是python环境的名称。

          【讨论】:

          • 这如何给出 conda 环境的名称?
          • 如果您运行的 python 不是来自活动环境,这是不正确的。
          • 对我来说是Path(sys.executable).as_posix().split('/')[-2]
          【解决方案7】:

          编辑:糟糕,我没有注意到Ivo 的回答。假设我正在扩展它。


          如果你从终端运行你的 python 脚本:

          import os
          os.system("conda env list")
          

          这将列出所有 conda 环境,如来自带有conda env list 的终端。

          稍微好一点:

          import os
          _ = os.system("conda env list | grep '*'")
          

          _ = 位将使对os.system 的调用的存在状态静音(0 如果成功),grep 将仅打印出激活 conda 环境的行。

          如果您不从终端运行脚本(例如,它是通过 crontab 安排的),那么上面将没有任何地方可以“打印”结果。相反,您需要使用类似 python 的 subprocess 模块。最简单的解决方案可能是运行:

          import subprocess
          output = subprocess.check_output("conda env list | grep '*'", shell=True, encoding='utf-8')
          print(output)
          

          output 是一个字符串,其中包含命令conda env list输出,而不是它的退出状态(也可以检索,参见subprocess 模块的文档)。

          现在您有了一个包含已激活 conda 环境信息的字符串,您可以执行所需的任何测试(使用正则表达式)来执行(或不执行)问题中提到的安装。

          备注。
          当然,如果您的脚本不是从终端运行的,上面块中的print(output) 将无效,但是如果您在从终端运行的脚本中测试块,那么您可以验证它是否为您提供了您想要的。例如,您可以将此信息打印到日志文件中(推荐使用logging 模块)。

          【讨论】:

            【解决方案8】:

            由于与“我如何确定我的 python 环境”相关的类似搜索导致了这个答案,我想我还会提到一种方法,我可以找出我当前正在从哪个环境运行我的代码。 我检查了我的 pip 二进制文件的位置,它指向 当前环境 中的一个位置。通过查看以下命令的输出,您可以轻松确定您所在的环境。(请注意,如果您从全局环境/其他环境中继承了 pip 包,则此解决方案不适用)

            Windows命令提示符下:

            where pip
            

            如果您在 Jupyter Notebook 中,请在命令前添加感叹号 (!) 以在主机命令提示符中执行命令:

            in[10]: !where pip
            

            输出将如下所示:

            C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
            C:\ProgramData\Anaconda3\Scripts\pip.exe
            

            YourEnvironmentName 给出您当前环境的名称。

            Linux/Mac 中,您可以使用 which 命令代替 where:(未测试)。

            对于python3环境

            which pip3
            

            来自 Jupyter 笔记本

            in[10]: !which pip3
            

            这应该直接指向您当前环境中的位置。

            【讨论】:

            • 这回答了我的困惑。我用pip3 install 安装了jupyter notebook,jupyter notebook 将在pip3 给出的环境中运行,而不是conda。我已经安装了 conda,但我的 CentOS linux 上没有安装 Anaconda。
            【解决方案9】:

            很简单,你可以这样做

            envs = subprocess.check_output('conda env list').splitlines()
            active_env = list(filter(lambda s: '*' in str(s), envs))[0]
            env_name = str(active_env).split()[0]
            

            【讨论】:

            • 运行它时会出错,除非我将命令作为列表——['conda','env','list']——然后无论我使用 Py2 还是 Py3 内核运行它,我都会得到相同的答案(root) .然而,检查sys.path 会显示出不同的结果。
            猜你喜欢
            • 1970-01-01
            • 2017-08-18
            • 2021-06-13
            • 2020-12-14
            • 2020-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多