2016-04-11 29 views
8

Sto cercando un buon modo per capire il nome dell'ambiente condominio in cui mi trovo da codice in esecuzione o un'istanza python interattiva.Come trovo il nome dell'ambiente conda in cui è in esecuzione il mio codice?

Il caso di utilizzo è che eseguo i quaderni Jupyter con kernel Python 2 e Python 3 da un'installazione miniconda. L'ambiente predefinito è Py3. Esiste un ambiente separato per Py2. All'interno del file di un taccuino, voglio provare a conda install foo. Sto usando subcommand per fare questo per ora, dal momento che non riesco a trovare un equivalente conda programmatico di pip.main(['install','foo']).

Il problema è che il comando deve conoscere il nome dell'ambiente Py2 per installare foo lì se il notebook è in esecuzione utilizzando il kernel Py2. Senza le informazioni installate nell'env Py3 predefinito. Mi piacerebbe che il codice individuasse l'ambiente in cui si trova e il nome giusto per conto suo.

La soluzione migliore che ho finora è:

import sys 

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

C'è un/modo più diretto adeguato per raggiungere questo obiettivo?

+0

Se non mi sbaglio, 'Conda installare x' installerà in qualunque contesto attuale è: così se il notebook si trova nell'ambiente Python 2, verrà installato in quell'ambiente. – tfb

+0

Ho appena provato il seguente esperimento. In un taccuino Jupyter lanciato dal mio ambiente anaconda predefinito (ma con entrambi i kernel ipython Py2 e Py3 disponibili) ho eseguito '! Conda env list' in una cella e' importa sottoprocesso; print (subprocess.check_output (['conda', 'env', 'list']). decode()) 'in un altro. Entrambi mostrano l'ambiente predefinito come attivo se eseguo il notebook in Py2 o Py3, quindi potrebbe essere che i comandi emessi contro il sistema operativo operino in qualsiasi ambiente con il quale il server di jupiter è stato avviato. – Alnilam

risposta

11

Volete $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) 

in Python:

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

Le variabili di ambiente non sono Ben documentato. Potete trovare CONDA_DEFAULT_ENV menzionati qui: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

L'unica informazioni CONDA_PREFIX ho potuto trovare è questo numero: https://github.com/conda/conda/issues/2764

+0

Questa è la risposta e l'OP deve accettare. – abalter

+0

os.environ ['CONDA_PREFIX'] funziona bene per me. – zerocog

0

molto semplicemente, si potrebbe fare

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] 
+1

Ricevo un errore in esecuzione a meno che non metta il comando come lista - '['conda', 'env', 'list']' - e poi ottengo la stessa risposta (root) se eseguo questo usando un Py2 o un kernel Py3. L'esame di 'sys.path', tuttavia, mostra risultati diversi per ciascuno. – Alnilam