如何从Python中检测是否使用conda管理包

jak*_*vdp 21 python conda

我想从Python会话中以一般方式检测它是否由conda管理.

一些不够通用的想法是有用的:

1:使用环境变量

如何找到运行代码的conda环境的名称中所述?

import os
is_conda = 'CONDA_PREFIX' in os.system or 'CONDA_DEFAULT_ENV' in os.system
Run Code Online (Sandbox Code Playgroud)

这似乎不适用于根conda环境,其中并不总是定义这些变量.如果在使用其他Python安装时碰巧激活了conda,它也可能存在误报.

2:检查可执行文件路径

import sys
is_conda = ('anaconda' in sys.executable) or ('miniconda' in sys.executable)
Run Code Online (Sandbox Code Playgroud)

这将适用于用户在默认路径中安装anaconda/miniconda的情况.否则可能会失败.也很容易想象假阳性.

3.检查版本信息

正如在任何方式判断用户的python环境是否为anaconda的答案中所述,您可以在某些情况下检查Python版本字符串:

import sys
is_conda = ('Continuum Analytics' in sys.version) or ('Anaconda' in sys.version)
Run Code Online (Sandbox Code Playgroud)

这适用于从默认通道安装的Python,但这非常脆弱,将来可能会中断,特别是Continuum的公司名称更改.如果从第三方来源(如conda-forge)安装Python,它也可能会失败.

4.检查conda导入

try:
    import conda
except:
    is_conda = False
else:
    is_conda = True
Run Code Online (Sandbox Code Playgroud)

只要您处于根conda环境中,这通常会失败,但如果您处于conda默认情况下未安装软件包的另一个conda环境中,则通常会失败.

5:试着conda看看它是否有效

Atto Allas的建议如下:

import subprocess
try:
    retcode = subprocess.call(['conda', 'install', '-y', 'pip'])
except:
    is_conda = False
else:
    is_conda = (retcode == 0)
Run Code Online (Sandbox Code Playgroud)

这在最简单的情况下有效,但在Jupyter中使用多个内核的常见情况下失败,其中conda可执行文件可能连接到当前的Python内核,也可能没有连接到当前的Python内核.


是否有任何完全通用的方法从Python检测Python安装是否由conda管理?

Ros*_*nen 13

import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
Run Code Online (Sandbox Code Playgroud)