如何在Python中检测是否使用conda

时间:2017-12-02 13:45:07

标签: python conda

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

一些不够通用的想法:

1:使用环境变量

正如How do I find the name of the conda environment in which my code is running?

中所述
import os
is_conda = 'CONDA_PREFIX' in os.system or 'CONDA_DEFAULT_ENV' in os.system

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

2:检查可执行路径

import sys
is_conda = ('anaconda' in sys.executable) or ('miniconda' in sys.executable)

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

3。检查版本信息

any way to tell if user's python environment is anaconda的答案中所述,您可以在某些情况下检查Python版本字符串:

import sys
is_conda = ('Continuum Analytics' in sys.version) or ('Anaconda' in sys.version)

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

4。检查conda导入

try:
    import conda
except:
    is_conda = False
else:
    is_conda = True

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

5:尝试conda查看是否有效

来自Atto Allas below的建议:

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

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

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

5 个答案:

答案 0 :(得分:12)

import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta'))

答案 1 :(得分:2)

使用编译时标志似乎是相当准确的,并且希望在未来稳定。

def is_conda():
    import sysconfig
    return 'conda-bld' in sysconfig.get_config_var("abs_srcdir")

我不确定该特定键“abs_srcdir”,但sysconfig.get_config_values()有许多可能有效的项目。用我的系统python:

>>> sysconfig.get_config_var("abs_srcdir")
'/Library/Caches/com.apple.xbs/Binaries/python/python-97.50.7~5/TempContent/Objects/2.7/python'

用我的conda python:

In [17]: sysconfig.get_config_var("abs_srcdir")
Out[17]: '/Users/ilan/minonda/conda-bld/python-3.6_1482520641897/work/Python-3.6.0'

我希望编译时标志比运行时检查更健壮。像“conda in sys.prefix”这样的运行时可能会因为在“conda”子目录中安装Python.org而感到困惑。但编译时标志应该没问题。

答案 2 :(得分:2)

我认为最好的方法是Ross Hynten's answer的变体:在构建过程中,conda creates a file调用{sys.prefix}/conda-meta/history,因此检查其存在应告诉您是否使用conda以合理的方式:

import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta', 'history'))

这种做法仍有可能产生假阳性,但除非刻意这样做,否则在我看来是非常不可能的。

答案 3 :(得分:0)

也许这个?

?<yourname>

答案 4 :(得分:0)

当我通过这些想法和他们的弱点阅读时,我对“管理”的含义并不完全清楚。

└─╼ which -a python
/Users/me/anaconda/bin/python
/usr/bin/python
┌─[ ~/myPython]
└─╼ /Users/me/anaconda/bin/python
Python 2.7.13 |Anaconda 2.2.0 (x86_64)| (default, Dec 20 2016, 23:05:08) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> quit()
┌─[ ~/myPython]
└─╼ /usr/bin/python
Python 2.7.10 (default, Feb  7 2017, 00:08:15) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
┌─[ ~/myPython]
└─╼ source activate py36
(py36) ┌─[ ~/myPython]
└─╼ which -a python
/Users/me/anaconda/envs/py36/bin/python
/Users/me/anaconda/bin/python
/usr/bin/python
└─╼ python
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:14:59) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
(py36) ┌─[ ~/myPython]
└─╼ which -a python
/Users/me/anaconda/envs/py36/bin/python
/Users/me/anaconda/bin/python
/usr/bin/python

是线条:     Python 2.7.10(默认值     Python 2.7.13 | Anaconda 2.2.0(x86_64)     Python 3.6.2 | Continuum Analytics,Inc。

或多或少你要捕捉的东西?虽然这些并不总是出现,但最多也会很脆弱。使用平台检查图像可能是朝着有用的方向迈出的一步。

In [46]: platform.python_build()
Out[46]: ('default', 'Jul 20 2017 13:14:59')

In [47]: platform.python_compiler()
Out[47]: 'GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)'

In [48]: platform.python_implementation()
Out[48]: 'CPython'

这是conda的替代品,我预计,所以q似乎比conda更广泛。

(这个答案,只是因为这是我的第一篇SO帖子,我只有一个声明)