如何找到我的代码所在的 conda 环境的名称 运行?
How do I find the name of the conda environment in which my code is running?
我正在寻找一种好方法来从 运行 代码或交互式 python 实例中找出我所在的 conda 环境的名称。
用例是我是 运行 Jupyter notebooks,带有来自 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 ""
是否有更多 direct/appropriate 方法来完成此操作?
很简单,你可以做到
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_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中:
import os
print(os.environ['CONDA_DEFAULT_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_ENV
:
https://www.continuum.io/blog/developer/advanced-features-conda-part-1
关于 CONDA_PREFIX
我能找到的唯一信息是这个问题:
https://github.com/conda/conda/issues/2764
我正在使用这个:
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 解释器的路径(不管 activate/deactivate)——例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'
。其余代码只取最后一个路径段的第 3 个,这是环境所在文件夹的名称,通常也是 python 环境的名称。
由于与 'how do I determine my python environment' 相关的类似搜索导致了这个答案,我想我还会提到一种方法,可以找出我当前 运行 我的代码来自哪个环境。
我检查了 pip 二进制文件的位置,它指向 当前环境 中的 位置 。通过查看以下命令的输出,您可以轻松确定您所处的环境。(请注意,如果您从全局 environment/other 环境继承了 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
这应该直接指向您当前环境中的位置。
编辑: 糟糕,我没注意到 的回答。假设我正在扩展它。
如果您 运行 来自终端的 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
安排的),那么上面的任何地方都不会 "print" 结果。相反,您需要使用类似 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
模块)。
在 Windows 上(在 Linux 上可能有效但未经测试):
import sys
import os
# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )
使用环境变量或假设路径分隔符为“/”的答案在我的 Windows/Anaconda3 环境中不起作用。
这假定您在一个环境中。
有几个答案建议使用 'which pip'、'which python' 或 'conda env list to grep the default'。如果用户正在做类似的事情,这项工作:
$畅达激活env_name;
$ python ... 或 $ jupyter notebook/jupyterlab。
当用户在没有 conda activate 的情况下直接调用 python 时,方法 #1 将不起作用:例如$ /opt/conda/envs/my_env/bin/python(其中 my_env 是 env 的名称)
在使用 jupyter notebook 的更一般情况下,可以 select 任何可用的 conda env/kernel,而 selected 可能不会与默认值相同。
所以解决方案是检查您当前 python 的可执行文件或路径,就像许多人之前 posted 一样。基本上,sys.path return 是可执行文件的完整路径,然后可以使用 split 找出 envs/ 之后的名称,即 env_name。问这个问题的人回答的还不错,就是漏了这个....
我认为没有任何 post 处理基本环境的特殊情况。注意基础环境中的 python 只是 /opt/conda/bin/python。所以可以简单地添加以下代码片段来进行匹配
如果 /opt/conda/bin/python 在 sys.path 中:
return'base'
这里我们假设 conda 安装在 /opt/conda 上。对于真正通用的解决方案,可以使用 $ conda info --root 来查找安装路径。
conda info
直接列出第一行你能看到的所有信息
active environment: (some name)
active env location: (location of active environment)
我想这是最清楚的方法。
在 Jupyter Notebook 或 Jupyter Lab 等交互式环境中,您应该在键入命令之前使用 %,如下所示,
%conda info
对于通常更有用的绝对完整路径:
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
我正在寻找一种好方法来从 运行 代码或交互式 python 实例中找出我所在的 conda 环境的名称。
用例是我是 运行 Jupyter notebooks,带有来自 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 ""
是否有更多 direct/appropriate 方法来完成此操作?
很简单,你可以做到
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_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中:
import os
print(os.environ['CONDA_DEFAULT_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_ENV
:
https://www.continuum.io/blog/developer/advanced-features-conda-part-1
关于 CONDA_PREFIX
我能找到的唯一信息是这个问题:
https://github.com/conda/conda/issues/2764
我正在使用这个:
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 解释器的路径(不管 activate/deactivate)——例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'
。其余代码只取最后一个路径段的第 3 个,这是环境所在文件夹的名称,通常也是 python 环境的名称。
由于与 'how do I determine my python environment' 相关的类似搜索导致了这个答案,我想我还会提到一种方法,可以找出我当前 运行 我的代码来自哪个环境。 我检查了 pip 二进制文件的位置,它指向 当前环境 中的 位置 。通过查看以下命令的输出,您可以轻松确定您所处的环境。(请注意,如果您从全局 environment/other 环境继承了 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
这应该直接指向您当前环境中的位置。
编辑: 糟糕,我没注意到
如果您 运行 来自终端的 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
安排的),那么上面的任何地方都不会 "print" 结果。相反,您需要使用类似 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
模块)。
在 Windows 上(在 Linux 上可能有效但未经测试):
import sys
import os
# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )
使用环境变量或假设路径分隔符为“/”的答案在我的 Windows/Anaconda3 环境中不起作用。
这假定您在一个环境中。
有几个答案建议使用 'which pip'、'which python' 或 'conda env list to grep the default'。如果用户正在做类似的事情,这项工作: $畅达激活env_name; $ python ... 或 $ jupyter notebook/jupyterlab。
当用户在没有 conda activate 的情况下直接调用 python 时,方法 #1 将不起作用:例如$ /opt/conda/envs/my_env/bin/python(其中 my_env 是 env 的名称)
在使用 jupyter notebook 的更一般情况下,可以 select 任何可用的 conda env/kernel,而 selected 可能不会与默认值相同。
所以解决方案是检查您当前 python 的可执行文件或路径,就像许多人之前 posted 一样。基本上,sys.path return 是可执行文件的完整路径,然后可以使用 split 找出 envs/ 之后的名称,即 env_name。问这个问题的人回答的还不错,就是漏了这个....
我认为没有任何 post 处理基本环境的特殊情况。注意基础环境中的 python 只是 /opt/conda/bin/python。所以可以简单地添加以下代码片段来进行匹配 如果 /opt/conda/bin/python 在 sys.path 中: return'base'
这里我们假设 conda 安装在 /opt/conda 上。对于真正通用的解决方案,可以使用 $ conda info --root 来查找安装路径。
conda info
直接列出第一行你能看到的所有信息
active environment: (some name)
active env location: (location of active environment)
我想这是最清楚的方法。
在 Jupyter Notebook 或 Jupyter Lab 等交互式环境中,您应该在键入命令之前使用 %,如下所示,
%conda info
对于通常更有用的绝对完整路径:
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