Estoy buscando una buena manera de averiguar el nombre de la conda entorno soy de dentro de la ejecución de código o un sistema interactivo de python instancia.

El caso de uso es que estoy ejecutando Jupyter cuadernos con Python 2 y Python 3 granos de un miniconda instalar. El entorno predeterminado es Py3. Hay un ambiente separado para Py2. Dentro de el un archivo de notebook, quiero tratar de conda install foo. Estoy usando subcommand a hacer esto por ahora, ya no puedo encontrar un programática conda equivalente de pip.main(['install','foo']).

El problema es que el comando necesita saber el nombre de la Py2 entorno para instalar foo allí si el notebook está funcionando el uso de la Py2 kernel. Sin que la información que se instala por defecto en la Py3 env. Me gustaría que el código para descifrar el ambiente que es en y el nombre correcto para él por su propia cuenta.

La mejor solución que he conseguido hasta ahora es:

import sys

def get_env():
    sp = sys.path[1].split("/")
    if "envs" in sp:
        return sp[sp.index("envs") + 1]
    else:
        return ""

Hay una manera más directa/de forma apropiada para lograr esto?

  • A menos que me equivoco, conda install x se instalará en cualquiera que sea el entorno actual es: así que si el notebook está en Python 2 medio ambiente, a continuación, se va a instalar en ese ambiente.
  • Acabo de probar el siguiente experimento. En un Jupyter notebook lanzado desde mi defecto anaconda medio ambiente (pero con tanto Py2 y Py3 ipython los núcleos disponibles) me encontré con !conda env list en una celda y import subprocess; print(subprocess.check_output(['conda','env', 'list']).decode()) en otro. Ambos muestran el valor predeterminado env como ser activo si puedo ejecutar el bloc de notas en Py2 o Py3, así que es posible que los comandos de ser emitida en contra de la os operar en lo que env el júpiter servidor fue lanzada el uso.
InformationsquelleAutor Alnilam | 2016-04-11

6 Comentarios

  1. 43

    Desea $CONDA_DEFAULT_ENV o $CONDA_PREFIX:

    $ source activate my_env
    (my_env) $ echo $CONDA_DEFAULT_ENV
    my_env
    
    (my_env) $ echo $CONDA_PREFIX
    /Users/nhdaly/miniconda3/envs/my_env
    
    $ source deactivate
    $ echo $CONDA_DEFAULT_ENV  # (not-defined)
    
    $ echo $CONDA_PREFIX  # (not-defined)

    En python:

    In [1]: import os
       ...: print os.environ['CONDA_DEFAULT_ENV']
       ...:
    my_env

    Las variables de entorno no están bien documentados. Usted puede encontrar CONDA_DEFAULT_ENV que se mencionan aquí:
    https://www.continuum.io/blog/developer/advanced-features-conda-part-1

    La única información sobre CONDA_PREFIX he podido encontrar es este Tema:
    https://github.com/conda/conda/issues/2764

    • Esta es la respuesta, y la OP debe aceptar.
    • os.environ[‘CONDA_PREFIX’] funciona bien para mí.
  2. 3

    Estoy usando esto:

    import sys
    sys.executable.split('/')[-3]

    tiene la ventaja de que no asume la env se encuentra en el camino (y se anida bajo envs). Además, no requieren el medio ambiente al ser activado a través de source activate.

    Edit: Si desea asegurarse de que funciona en Windows, y también:

    import sys
    from pathlib import Path
    Path(sys.executable).as_posix().split('/')[-3]

    Para aclarar: sys.executable le da la trayectoria de la corriente intérprete de python (independientemente de activar/desactivar) — por ejemplo '/Users/danielsc/miniconda3/envs/nlp/bin/python'. El resto del código sólo se necesita el 3º por último segmento de la ruta, que es el nombre de la carpeta en el ambiente, que suele ser también el nombre de python medio ambiente.

    • ¿Cómo es que esto de dar el nombre de la conda medio ambiente?
    • Esto es incorrecto, si está ejecutando una de python que no es del entorno activo.
  3. 2

    muy simple, usted podría hacer

    envs = subprocess.check_output('conda env list').splitlines()
    active_env = list(filter(lambda s: '*' in str(s), envs))[0]
    env_name = str(active_env).split()[0]
    • Me sale un error al ejecutar este a menos que me ponga el comando como una lista – ['conda','env','list'] — y, a continuación, obtengo la misma respuesta (root) si ejecuto esta usando un Py2 o un Py3 kernel. El examen de la sys.path, sin embargo, muestra resultados diferentes para cada uno.
  4. 1

    Desde similares búsquedas relacionadas con «¿cómo puedo determinar mi ambiente python’ conduce a esta contestar pensé también voy a mencionar una forma de averiguar el ambiente que actualmente estoy ejecutando mi código de.
    Puedo comprobar la ubicación de mi pip binario que apunta a un ubicación dentro de la entorno actual. Mirando la salida del siguiente comando se puede determinar fácilmente el ambiente que usted está en. (Por favor, tenga en cuenta que esta solución no es aplicable si se ha heredado pip paquetes de su medio ambiente mundial/otro entorno)

    En Windows símbolo del sistema:

    where pip

    Si está dentro de un Jupyter Notebook agregar un signo de exclamación(!) antes de que el comando para ejecutar el comando en el host símbolo del sistema:

    in[10]: !where pip

    El resultado será parecido a este:

    C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
    C:\ProgramData\Anaconda3\Scripts\pip.exe

    YourEnvironmentName da el nombre de su entorno actual.

    En Linux/Mac, puede utilizar el comando which lugar de donde: (No probado).

    Para python3 entorno

    which pip3

    De Jupyter notebook:

    in[10]: !which pip3

    Este debe de apuntar a la ubicación dentro de su entorno actual.

  5. 1

    Edición: Uy, yo no había notado Ivo‘s respuesta. Digamos que me estoy extendiendo un poco sobre ella.


    Si ejecuta la secuencia de comandos de python desde la terminal:

    import os
    os.system("conda env list")

    Esto mostrará una lista de todos los conda entornos, como desde la terminal con conda env list.

    Un poco mejor:

    import os
    _ = os.system("conda env list | grep '*'")

    La _ = poco va a silenciar la existencia de estado de la llamada a os.system (0 en caso de éxito), y grep sólo se imprime la línea con la activa conda medio ambiente.

    Si no ejecutar la secuencia de comandos de terminal (por ejemplo, se ha programado a través de crontab), entonces lo anterior no tendrá lugar «imprimir» el resultado. En su lugar, usted necesita usar algo como python subprocess módulo. La solución más sencilla es probablemente para la ejecución:

    import subprocess
    output = subprocess.check_output("conda env list | grep '*'", shell=True, encoding='utf-8')
    print(output)

    A saber output es una cadena que contiene el salida del comando conda env list, no su estado de salida (que también puede ser recuperada de la cookie, consulte la documentación de la subprocess módulo).

    Ahora que usted tiene una cadena con la información sobre el activo de conda entorno, puede realizar lo que prueba que usted necesita (usando expresiones regulares) para realizar (o no) la instala menciona en su pregunta.

    Comentario.

    Por supuesto, print(output) en el bloque anterior, no tendrán ningún efecto si el script no se ejecuta desde la terminal, pero si la prueba es el bloque en una secuencia de comandos que se ejecuta desde la terminal, entonces usted puede verificar que se te da lo que quieres. Por ejemplo, puede imprimir esta información en un archivo de registro (usando el logging módulo se recomienda).

  6. 0

    En Windows (podría funcionar, pero no probado en Linux):

    import sys
    import os
    
    # e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
    print( sys.exec_prefix.split(os.sep)[-1] )

    Respuestas usando variables de entorno o asumiendo el separador de ruta es «/» no funciona en mi Windows/Anaconda3 medio ambiente.

    Esto asume que usted está en un entorno.

Dejar respuesta

Please enter your comment!
Please enter your name here