sklearn python conda

sklearn - anaconda python



Cómo detectar desde Python si los paquetes se administran con conda (5)

Me gustaría detectar de forma general desde dentro de una sesión de Python si es administrado por conda.

Algunas ideas que no son lo suficientemente generales para ser útiles:

1: utilizar variables de entorno

Como se menciona en ¿Cómo encuentro el nombre del entorno conda en el que se ejecuta mi código?

import os is_conda = ''CONDA_PREFIX'' in os.system or ''CONDA_DEFAULT_ENV'' in os.system

Esto parece no funcionar en el entorno de la raíz raíz, donde estas variables no siempre están definidas. También tiene posibles falsos positivos si se activa conda mientras está usando otra instalación de Python.

2: comprueba el camino ejecutable

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

Esto funcionará en el caso de que los usuarios instalen anaconda / miniconda en la ruta predeterminada. De lo contrario puede fallar. También es fácil imaginar falsos positivos.

3. Compruebe la información de la versión

Como se indica en las respuestas a cualquier forma de saber si el entorno de Python del usuario es anaconda , puede verificar la cadena de la versión de Python en algunos casos:

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

Esto funciona actualmente para Python instalado desde el canal predeterminado, pero es bastante frágil y puede romperse en el futuro, particularmente con el cambio de nombre de la empresa de Continuum. También es probable que falle si Python se instala desde una fuente de terceros como conda-forge.

4. Comprobar la importación de conda

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

Esto funciona siempre que esté en el entorno raíz de Conda, pero generalmente falla si se encuentra en otro entorno de Conda donde el paquete de conda no está instalado de forma predeterminada.

5: Prueba conda para ver si funciona.

Sugerencia de Atto Allas a below :

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

Esto funciona en los casos más simples, pero falla en el caso común de usar varios kernels en Jupyter, donde el ejecutable de conda puede o no estar conectado al kernel de Python actual.

¿Hay alguna forma completamente general de detectar desde Python si esa instalación de Python es administrada por conda?


¿Tal vez esto?

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


Creo que el mejor enfoque es una variación de la respuesta de Ross Hynten : en el proceso de compilación, conda crea un archivo llamado {sys.prefix}/conda-meta/history , por lo que verificar su presencia debería indicarle si está usando conda en una manera razonablemente robusta:

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

Sigue siendo posible tener falsos positivos con este enfoque, pero me parece muy poco probable a menos que se haga de forma deliberada.


Cuando leo a través de las ideas y sus debilidades, no estoy del todo claro por lo que quiere decir con "administrado".

└─╼ 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

son las líneas: Python 2.7.10 (por defecto Python 2.7.13 | Anaconda 2.2.0 (x86_64) Python 3.6.2 | Continuum Analytics, Inc.

Más o menos lo que estás tratando de capturar? Concedidos estos no siempre aparecen y serían frágiles en el mejor de los casos. Examinar la imagen usando la plataforma puede ser un paso en una dirección útil.

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''

Las alternativas a conda son, espero, entonces q parecen ser más amplias que conda.

(Esta es una respuesta, solo porque esta es mi primera publicación SO, y solo tengo una única reputación)


El uso de indicadores de tiempo de compilación parece ser razonablemente preciso y, con suerte, estable en el futuro.

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

No estoy seguro de esa clave específica "abs_srcdir", pero sysconfig.get_config_values() tiene muchos elementos que pueden funcionar. Con mi sistema python es:

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

Y con mi conda python es:

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

Mi esperanza es que los indicadores de tiempo de compilación sean más robustos que los controles de tiempo de ejecución. Cosas de tiempo de ejecución como "es conda en sys.prefix" se pueden confundir al tener una instalación de Python.org en un subdirectorio "conda". Pero las banderas de tiempo de compilación deberían estar bien.


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