2014-01-22 7 views
8

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 einfallen
def _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.

+0

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

+0

@Bakuriu was ist der Nachteil der Verwendung von Shell = True? – badideas

+0

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

Antwort

8
In [109]: import sys 

In [110]: 'conda' in sys.version 
Out[110]: True 
14

Ich bin von Continuum, so lassen Sie mich eine kurze Notiz machen: Sie werden eine andere sys.version Zeichenfolge erhalten, je nachdem, ob Sie conda verwendete Anaconda installieren Python-Verteilung oder einfach Python. Also von conda create -n full_apd anaconda würden Sie einen sys.version String erhalten, wie folgt:

$ python -c "import sys; print sys.version" 
2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)] 

Dies ist, was Sie bekommen, wenn Sie miniconda oder arbeiten von einem conda Umgebung verwenden, wo man nur python angegeben haben (zB conda create -n base_py27 python=2.7):

$ python -c "import sys; print sys.version" 
2.7.6 |Continuum Analytics, Inc.| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)] 

Wenn Sie einfach heruntergeladen und installiert haben die volle Anaconda Python-Distribution direkt, erhalten Sie die ehemalige erhalten:

$ python -c "import sys; print sys.version" 
2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Jan 10 2014, 11:23:15) 
[GCC 4.0.1 (Apple Inc. build 5493)] 
+0

thanks ian. Ich habe Code eingefügt, um entweder "Anaconda" oder "Kontinuum" in der Zeichenfolge sys.version abzufangen. hoffentlich sollte das zumindest solange funktionieren, wie ich diese Bibliothek pflege :) – badideas

+0

Wenn wir eine Conda-Umgebung verwenden, wie können wir feststellen, welche Version von Conda aus dem Python-Interpreter verwendet wird? Zum Beispiel im ersten Fall, den du erwähnt hast, könnte ich für "Anaconda M.N.V" analysieren und M, N, ein V überprüfen. Ich würde gerne so etwas für den Fall machen, wenn ich eine Conda-Umgebung verwende. – user3731622

Verwandte Themen