2016-04-11 33 views
8

Szukam dobry sposób, aby dowiedzieć się nazwę środowiska conda jestem w ramach kodu uruchomionego lub interaktywnej instancji Pythona.Jak znaleźć nazwę środowiska conda, w którym działa mój kod?

Używam tego, że używam notebooków Jupyter zarówno z jądrem Python 2, jak i Python 3 z instalacji miniconda. Domyślne środowisko to Py3. Istnieje oddzielne środowisko dla Py2. Wewnątrz pliku notatnika chcę, aby spróbował on uzyskać conda install foo. Używam do tego celu subcommand, ponieważ nie mogę znaleźć programowego odpowiednika warunkowego pip.main(['install','foo']).

Problem polega na tym, że polecenie musi znać nazwę środowiska Py2, aby zainstalować tam foo, jeśli komputer jest uruchomiony przy użyciu jądra Py2. Bez tych informacji instaluje się w domyślnym środowisku Py3. Chciałabym, żeby kod wyodrębnił środowisko, w którym się znajduje, i nazwę dla niego samego.

Najlepszym rozwiązaniem mam tak daleko jest:

import sys 

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

Czy istnieje bardziej bezpośredni/właściwym sposobem do osiągnięcia tego celu?

+0

O ile się nie mylę, 'Conda zainstalować x' zainstaluje w jakiejkolwiek obecnej sytuacji brzmi: tak jeśli notebook znajduje się w środowisku Python 2, zostanie zainstalowany w tym środowisku. – tfb

+0

Właśnie próbowałem następującego eksperymentu. W notebooku Jupyter uruchomionym z mojego domyślnego środowiska anakond (ale z dostępnymi jądrami Py2 i Py3) uruchomiłem '! Conda env list' w jednej komórce i' importuj podproces; print (subprocess.check_output (['conda', 'env', 'list']). decode()) 'w innym. Oba pokazują domyślne env jako aktywne, niezależnie od tego, czy uruchomię notebooka w Py2 czy Py3, więc może być tak, że komendy wydawane przeciwko os działają w dowolnym środowisku, z którego został uruchomiony serwer Jupiter. – Alnilam

Odpowiedz

11

Chcesz $CONDA_DEFAULT_ENV lub $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) 

W python:

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

Zmienne środowiskowe nie są dobrze udokumentowane. Można znaleźć CONDA_DEFAULT_ENV wspomniano tutaj: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

Jedynym informacji na CONDA_PREFIX udało mi się znaleźć to ten problem: https://github.com/conda/conda/issues/2764

+0

To jest odpowiedź, a PO powinien zaakceptować. – abalter

+0

os.environ ["CONDA_PREFIX"] działa dobrze dla mnie. – zerocog

0

bardzo prosty sposób, można zrobić

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

Otrzymuję błąd z tym związany, chyba że ustawię komendę jako listę - '['conda', 'env', 'list']' - a następnie otrzymam tę samą odpowiedź (root), czy uruchomię to za pomocą Py2 lub jądro Py3. Badanie 'sys.path' jednak pokazuje różne wyniki dla każdego. – Alnilam

Powiązane problemy