如何从 Python 中检测软件包是否由 conda 管理
How to detect from within Python whether packages are managed with conda
我想从 Python 会话中以一般方式检测它是否由 conda 管理。
一些不够通用的想法,没有用处:
1:使用环境变量
如
所述
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 公司名称的更改。如果 Python 是从 conda-forge 等第三方来源安装的,它也可能会失败。
4。检查 conda
导入
try:
import conda
except:
is_conda = False
else:
is_conda = True
只要您在根 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)
这在最简单的情况下有效,但在 Jupyter 中使用多个内核的常见情况下失败,其中 conda
可执行文件可能连接也可能不连接到当前 Python 内核。
是否有任何完全通用的方法来检测 Python Python 安装是否由 conda 管理?
也许是这个?
from subprocess import check_output, CalledProcessError
import sys
def is_conda_managed():
try:
out = check_output(['conda', 'env', 'list']).decode('utf-8')
lines = (line for line in out.splitlines() if line[:1] != '#')
roots = set(line.split()[-1] for line in lines if line.strip())
except CalledProcessError:
roots = set()
return sys.prefix in roots
使用编译时标志似乎是相当准确的,并且有望在未来保持稳定。
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" 子目录中安装 Python.org 可能会混淆像 "is conda in sys.prefix" 这样的运行时内容。但是编译时标志应该没问题。
import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
当我通读这些想法及其弱点时,我并不完全明白你所说的 'managed' 是什么意思。
└─╼ 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 |蟒蛇 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 post,而且我只有一个声誉)
我认为最好的方法是 : in the build process, 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'))
这种方法仍有可能出现误报,但在我看来,除非故意这样做,否则不太可能。
我想从 Python 会话中以一般方式检测它是否由 conda 管理。
一些不够通用的想法,没有用处:
1:使用环境变量
如
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 公司名称的更改。如果 Python 是从 conda-forge 等第三方来源安装的,它也可能会失败。
4。检查 conda
导入
try:
import conda
except:
is_conda = False
else:
is_conda = True
只要您在根 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)
这在最简单的情况下有效,但在 Jupyter 中使用多个内核的常见情况下失败,其中 conda
可执行文件可能连接也可能不连接到当前 Python 内核。
是否有任何完全通用的方法来检测 Python Python 安装是否由 conda 管理?
也许是这个?
from subprocess import check_output, CalledProcessError
import sys
def is_conda_managed():
try:
out = check_output(['conda', 'env', 'list']).decode('utf-8')
lines = (line for line in out.splitlines() if line[:1] != '#')
roots = set(line.split()[-1] for line in lines if line.strip())
except CalledProcessError:
roots = set()
return sys.prefix in roots
使用编译时标志似乎是相当准确的,并且有望在未来保持稳定。
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" 子目录中安装 Python.org 可能会混淆像 "is conda in sys.prefix" 这样的运行时内容。但是编译时标志应该没问题。
import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
当我通读这些想法及其弱点时,我并不完全明白你所说的 'managed' 是什么意思。
└─╼ 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 |蟒蛇 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 post,而且我只有一个声誉)
我认为最好的方法是 {sys.prefix}/conda-meta/history
,因此检查它的存在应该告诉您是否以合理可靠的方式使用 conda:
import sys, os
is_conda = os.path.exists(os.path.join(sys.prefix, 'conda-meta', 'history'))
这种方法仍有可能出现误报,但在我看来,除非故意这样做,否则不太可能。