2016-04-11 5 views
8

Ich bin auf der Suche nach einer guten Möglichkeit, den Namen der Conda-Umgebung, in der ich bin, aus dem laufenden Code oder einer interaktiven Python-Instanz herauszufinden.Wie finde ich den Namen der Conda-Umgebung, in der mein Code läuft?

Der Anwendungsfall ist, dass ich Jupyter Notebooks mit Python 2 und Python 3 Kernel von einer Miniconda-Installation aus laufe. Die Standardumgebung ist Py3. Es gibt eine separate Umgebung für Py2. Innerhalb der Notebook-Datei möchte ich versuchen, conda install foo. Ich benutze subcommand, um dies jetzt zu tun, da ich kein programmatisches Conda-Äquivalent von pip.main(['install','foo']) finden kann.

Das Problem ist, dass der Befehl den Namen der Py2-Umgebung kennen muss, um foo dort zu installieren, wenn das Notebook mit dem Py2-Kernel läuft. Ohne diese Information wird es im Standard-Py3-env installiert. Ich möchte, dass der Code selbst herausfindet, in welcher Umgebung er sich befindet und wie er richtig heißt.

Die beste Lösung, die ich habe, so weit ist:

import sys 

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

Gibt es einen direkteren/geeigneten Weg, um dies zu erreichen?

+0

Wenn ich nicht irre, 'Conda installiert x' in dem, was die aktuelle Umgebung ist zu installieren: so Wenn sich das Notebook in der Python 2-Umgebung befindet, wird es in dieser Umgebung installiert. – tfb

+0

Ich habe gerade das folgende Experiment versucht. In einem Jupyter-Notebook, das von meiner Standard-Anaconda-Umgebung gestartet wurde (aber beide Py2- und Py3-ipython-Kernel verfügbar), habe ich '! Conda env list' in einer Zelle ausgeführt und' subprocess importieren; print (subprocess.check_output (['conda', 'env', 'Liste']). decode()) 'in einem anderen. Beide zeigen das Standard-Env als aktiv an, egal ob ich das Notebook in Py2 oder Py3 laufe, also kann es sein, dass Befehle, die gegen das Betriebssystem ausgegeben werden, in welcher Umgebung auch immer der Jupiter-Server gestartet wird. – Alnilam

Antwort

11

Sie wollen $CONDA_DEFAULT_ENV oder $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 

Die Umgebungsvariablen nicht sind gut dokumentiert. Sie können CONDA_DEFAULT_ENV hier erwähnt finden: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

Die einzige Info über CONDA_PREFIX I ist dieses Problem gefunden: https://github.com/conda/conda/issues/2764

+0

Dies ist die Antwort, und das OP sollte akzeptieren. – abalter

+0

os.environ ['CONDA_PREFIX'] funktioniert gut für mich. – zerocog

0

sehr einfach, könnten Sie tun

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

Ich bekomme einen Fehler beim Ausführen dieser, wenn ich den Befehl als eine Liste - '['Conda', 'env', 'Liste']' - und dann bekomme ich die gleiche Antwort (root), ob ich dies mit einem ausführen Py2 oder ein Py3-Kernel. Das Überprüfen des 'sys.path' zeigt jedoch unterschiedliche Ergebnisse für jeden. – Alnilam

Verwandte Themen