Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法告诉用户';s的python环境是anaconda_Python_Anaconda - Fatal编程技术网

有没有办法告诉用户';s的python环境是anaconda

有没有办法告诉用户';s的python环境是anaconda,python,anaconda,Python,Anaconda,我正在分发一个内部python库,我希望这样做:如果用户在运行此文件时使用anaconda,那么将自动更新库的依赖项。(这是请求。如果由我决定,我会让用户控制他们自己的包。) 到目前为止,我已经想出了类似的办法 def _user_has_conda(): cmd = 'conda --help' p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) ou

我正在分发一个内部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中运行

我肯定有更好的想法,这就是我来这里的原因

谢谢。

文档:

对于版本>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'))

我来自Continuum,所以让我简要说明一下:您将获得不同的
sys.version
字符串,这取决于您是使用
conda
安装Anaconda Python发行版还是仅使用Python。因此,从
conda create-n full\u 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
或在刚刚指定
python
conda
环境中工作(例如
conda create-n base_py27 python=2.7
),您将得到以下结果:

如果您只是直接下载并安装了完整的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)]

在您的示例中,不应使用
shell=True
,而应使用
cmd
格式的
['conda','--help']
。关于您的问题:您能否检查一下sys.executable并查看解释器是否位于anaconda安装目录中?@Bakuriu使用shell=True的缺点是什么?它必须启动一个新的shell,然后执行您的命令,这意味着您增加了一些开销。在一般情况下(尽管不是您所展示的情况),它可能会增加安全风险,例如任意代码执行。仅当您确实需要一些shell功能时(例如,您希望在管道中执行更多命令,或者您希望使用一些shell内置功能等)才使用它。我已经在sys.version字符串中输入了捕获“anaconda”或“continuum”的代码。希望这至少在我维护这个库的时候起作用:)如果我们使用的是conda环境,我们如何从python解释器中判断使用的是哪个版本的conda?例如,在您提到的第一个案例中,我可以解析“Anaconda M.N.V”并选中M,N,an V。在使用conda环境时,我希望在这个案例中执行类似的操作。在python 3中,请尝试:$python-c“import sys;print(sys.version)”我的conda安装现在提供
3.7.2的sys.version(默认值,2019年1月2日,17:07:39)[MSC v.1915 64位(AMD64)]
因此我认为这不再有效。这可能会解决它:天生脆弱。这在常见的边缘情况下(例如Python>=3.7.1)肯定会失败。有关完全避免不可移植模式匹配的可靠替代方案,请参见。。我想这已经不起作用了,我的版本信息中没有conda,我正在使用它。@MikeWise您的
sys.version
是什么样的?'3.7.3(默认值,2019年3月27日,17:13:21)[MSC v.1915 64位(AMD64)]@MikeWise这应该会有帮助:--
os.path.exists(os.path.join(sys.prefix,'conda meta'))
$ 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)]
$ 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)]
$ 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)]