Ich verteile eine interne Python-Lib, wo ich es so machen möchten, dass, wenn der Benutzer Anaconda beim Ausführen dieser Datei verwendet, die Abhängigkeiten aktualisiert Die Bibliothek wird automatisch erstellt. (Das auf Wunsch ist. Wenn es nach mir ginge, würde ich die Benutzer lassen ihre eigenen Pakete zu steuern.)jeder Weg zu sagen, ob Benutzer Python-Umgebung Anaconda ist
so weit, ich habe wie
etwas einfallendef _user_has_conda():
cmd = 'conda --help'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if len(out) > 0 and len(err) == 0:
return True
else:
return False
aber das wirklich nur sagt mir, ob der Benutzer Anaconda auf seinem System installiert hat und nicht ob der aktuelle Python-Prozess in der Anaconda-Umgebung läuft.
was ich bemerke ist, dass, wenn ich eine Python- oder Ipython-Shell starte ich sehe "Python 3.3.3 | Continuum Analytics, Inc |" oben. Meine nächste Idee wäre zu versuchen, herauszufinden, wie man diese Zeichenfolge erhält, um zu sehen, ob "Continuum Analytics" vorhanden ist, und wenn ja, nehme an, dass der Benutzer in Anaconda läuft.
ich bin sicher es gibt bessere Ideen da draußen, und deshalb bin ich hier.
danke.
In Ihrem Beispiel sollten Sie * shell = True nicht verwenden, sondern ein 'cmd' der Form' ['conda', '--help'] 'verwenden. Zu Ihrer Frage: Können Sie 'sys.executable' nicht überprüfen und sehen, ob sich der Interpreter in einem Anaconda-Installationsverzeichnis befindet? – Bakuriu
@Bakuriu was ist der Nachteil der Verwendung von Shell = True? – badideas
Es muss eine neue Shell starten, die dann Ihren Befehl ausführt, was bedeutet, dass Sie etwas Overhead hinzufügen. Im allgemeinen Fall (obwohl nicht der, den Sie gezeigt haben), kann es Sicherheitsrisiken wie willkürliche Codeausführung hinzufügen. Verwenden Sie es nur *, wenn Sie tatsächlich eine * Shell * -Funktion benötigen (z. B. wenn Sie mehr Befehle in einer Pipe ausführen möchten oder wenn Sie eine eingebaute Shell usw. verwenden möchten) – Bakuriu