webentwicklung-frage-antwort-db.com.de

Wie finde ich den Namen der Conda-Umgebung, in der mein Code ausgeführt wird?

Ich suche nach einer guten Möglichkeit, den Namen der Conda-Umgebung, in der ich mich befinde, aus dem laufenden Code oder einer interaktiven python -Instanz herauszufinden.

Der Anwendungsfall ist, dass ich Jupyter-Notebooks mit den Kerneln Python 2 und Python 3 aus einer Miniconda-Installation ausführe. Die Standardumgebung ist Py3 Eine separate Umgebung für Py2. In einer Notizbuchdatei soll versucht werden, conda install foo. Ich verwende subcommand, um dies zu tun, da ich keine programmatische Bedingung finde Entspricht pip.main(['install','foo']).

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 ausgeführt wird. Ohne diese Informationen wird es in der Standard-Py3-Umgebung installiert. Ich möchte, dass der Code selbst herausfindet, in welcher Umgebung er sich befindet und welchen Namen er hat.

Die beste Lösung, die ich bisher habe, 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/angemesseneren Weg, um dies zu erreichen?

20
Alnilam

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 sind nicht gut dokumentiert. Sie finden CONDA_DEFAULT_ENV hier erwähnt: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

Die einzige Info über CONDA_PREFIX Ich konnte folgendes Problem finden: https://github.com/conda/conda/issues/2764

44
NHDaly

Ich benutze das:

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

es hat den Vorteil, dass es nicht annimmt, dass sich die env im Pfad befindet (und unter envs verschachtelt ist). Außerdem muss die Umgebung nicht über source activate Aktiviert werden.

Bearbeiten: Wenn Sie sicherstellen möchten, dass es auch unter Windows funktioniert:

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

Zur Verdeutlichung: sys.executable Gibt Ihnen den Pfad des aktuellen python Interpreters (unabhängig von Aktivierung/Deaktivierung) - zum Beispiel '/Users/danielsc/miniconda3/envs/nlp/bin/python'. Der Rest des Codes Nimmt nur das dritte aus dem letzten Pfadsegment. Dies ist der Name des Ordners, in dem sich die Umgebung befindet. Dies ist normalerweise auch der Name der python Umgebung.

3

ganz einfach, das könntest du 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]
2
Ivo

Edit: Ups, ich hatte Ivo s Antwort nicht bemerkt. Nehmen wir an, ich erweitere es ein wenig.


Wenn Sie Ihr python Skript vom Terminal ausführen:

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

Dies listet alle Conda-Umgebungen ab Terminal mit conda env list Auf.

Etwas besser:

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

Mit dem Bit _ = Wird der bestehende Status des Aufrufs von os.system Stummgeschaltet (0 Bei Erfolg), und grep druckt nur die Zeile mit dem aktivierten Status aus Conda-Umgebung.

Wenn Sie Ihr Skript nicht vom Terminal aus ausführen (z. B. wird es über crontab geplant), kann das Ergebnis mit den obigen Schritten nirgendwo "gedruckt" werden. Stattdessen müssen Sie so etwas wie das subprocess -Modul von Python verwenden. Die einfachste Lösung ist wahrscheinlich:

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

output ist nämlich ein String, der die Ausgabe des Befehls conda env list Enthält, nicht dessen Beendigungsstatus (der ebenfalls abgerufen werden kann, siehe Dokumentation von subprocess Modul).

Jetzt, da Sie eine Zeichenfolge mit den Informationen zur aktivierten Conda-Umgebung haben, können Sie jeden Test ausführen, den Sie benötigen (mit regulären Ausdrücken), um die in Ihrer Frage genannten Installationen auszuführen (oder nicht).

Bemerkung
Natürlich hat print(output) im obigen Block keine Auswirkung, wenn Ihr Skript nicht vom Terminal aus ausgeführt wird. Wenn Sie den Block jedoch in einem Skript testen, das Sie vom Terminal aus ausführen, können Sie dies Überprüfen Sie, ob es Ihnen das gibt, was Sie wollen. Sie können diese Informationen beispielsweise in eine Protokolldatei drucken (die Verwendung des Moduls logging wird empfohlen).

1
Antoine

Da ähnliche Suchanfragen im Zusammenhang mit "Wie bestimme ich meine python Umgebung?" Zu dieser Antwort führen, habe ich mir gedacht, ich werde auch eine Möglichkeit nennen, um herauszufinden, in welcher Umgebung ich gerade meinen Code ausführe. Ich überprüfe Die Position von my pip binary, die auf ein location innerhalb von current environment verweist. Durch Betrachten der Ausgabe des folgenden Befehls können Sie leicht feststellen in welcher Umgebung Sie sich befinden. (Bitte beachten Sie, dass diese Lösung nicht anwendbar ist, wenn Sie Pip-Pakete von Ihrer globalen Umgebung/anderen Umgebung geerbt haben.)

In Windows Eingabeaufforderung:

where pip

Wenn Sie sich in einem Jupyter-Notizbuch befinden, fügen Sie vor dem Befehl zum Ausführen des Befehls in Ihrer Host-Eingabeaufforderung ein Ausrufezeichen (!) Ein:

in[10]: !where pip

Die Ausgabe sieht ungefähr so ​​aus:

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

YourEnvironmentName gibt den Namen Ihrer aktuellen Umgebung an.

In Linux/Mac können Sie anstelle von where den Befehl which verwenden: (Nicht getestet).

Für Python3-Umgebung

which pip3

Aus Jupyter-Notizbuch :

in[10]: !which pip3

Dies sollte direkt auf den Ort in Ihrer aktuellen Umgebung verweisen.

1
codeslord

Unter Windows (könnte funktionieren, aber unter Linux nicht getestet):

import sys
import os

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

Die Verwendung von Umgebungsvariablen oder die Annahme, dass das Pfadtrennzeichen "/" lautet, hat in meiner Windows/Anaconda3-Umgebung nicht funktioniert.

Dies setzt voraus, dass Sie sich in einer Umgebung befinden.

0
MZB