12

我正在分发一个内部 python 库,我想在其中制作它,以便如果用户在运行此文件时使用 anaconda,则将自动更新库的依赖项。(这是根据要求。如果由我决定,我会让用户控制他们自己的包。)

到目前为止,我想出了类似的东西

def _user_has_conda():
    cmd = 'conda --help'
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    if len(out) > 0 and len(err) == 0:
        return True
    else:
        return False

但这实际上只告诉我用户是否在他们的系统上安装了 anaconda,而不是当前的 python 进程是否在 anaconda 环境中运行。

我注意到,当我启动 python 或 ipython shell 时,我看到“Python 3.3.3 |Continuum Analytics, Inc|” 在顶部。我的下一个想法是尝试找到如何获取此字符串以查看是否存在“Continuum Analytics”,如果存在,则假设用户正在 anaconda 中运行。

我敢肯定那里有更好的想法,这就是我在这里的原因。

谢谢你。

4

3 回答 3

16

我来自 Continuum,所以让我做一个简短的说明:sys.version根据您conda是安装Anaconda Python Distribution还是简单地安装Python ,您将获得不同的字符串。所以conda create -n full_apd anaconda你会得到一个sys.version字符串,如下所示:

$ python -c "import sys; print sys.version"
2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)]

miniconda如果您使用或conda在您刚刚指定的环境中工作python(例如conda create -n base_py27 python=2.7) ,这就是您所得到的:

$ python -c "import sys; print sys.version"
2.7.6 |Continuum Analytics, Inc.| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)]

如果您只是直接下载并安装了完整的 Anaconda Python 发行版,您将获得前者:

$ python -c "import sys; print sys.version"
2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)]
于 2014-01-23T20:45:13.887 回答
15

对于版本 <= 3.6:

In [109]: import sys

In [110]: 'conda' in sys.version
Out[110]: True

对于版本 >= 3.7,版本信息已更改为:

In [2]: sys.version
Out[2]: '3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]'

这篇文章 解决方案应更改为:

import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
于 2014-01-22T12:20:32.287 回答
5

文档:http ://docs.python.org/2/library/sys.html#sys.version

In [1]: import sys; sys.version
Out[1]: '2.7.5 |Anaconda 1.8.0 (64-bit)| (default, Jul  1 2013, 12:37:52) [MSC v.1500 64 bit (AMD64)]'
于 2014-01-22T12:15:05.727 回答