2016-09-20 3 views
1

Ich habe dieses einfache Python-Skript. Ich möchte eine Bedingung einfügen, die das Python-Modul überprüft (in meinem Beispiel unter subprocess), bevor Sie es ausführen. Wenn das Modul nicht vorhanden ist, installieren Sie das Modul und führen Sie das Skript aus. Wenn das Modul vorhanden ist, überspringen Sie die Installation des Moduls und führen Sie das Skript aus. Ich kämpfe mit den meisten ähnlichen Szenarien, die ich online sehe.Python-Skript, um zu überprüfen, ob Modul vorhanden ist, sonst installiere Modul

import subprocess 
ls_output = subprocess.check_output(['ls']) 
print ls_output 
+1

'subprocess' in 2,7 gebaut und 3.x. Es wurde zu 2.4 hinzugefügt. Sie sollten nicht versuchen, es auf etwas 2.4 oder neuer zu installieren. –

+0

Das klingt nach einer verdächtig falschen Sache, die ich machen möchte. Sie sollten die Bibliothek, die Sie installieren möchten, wahrscheinlich als eine Abhängigkeit von Ihrer Anwendung aufgelistet haben. Es wird dann installiert, wenn Ihre Anwendung installiert ist. Um eine Bibliothek zu installieren, würde Ihr Skript einen Superbenutzerzugriff erfordern, was ein Sicherheitsrisiko darstellt. Abgesehen davon, welche Installationsmethode würden Sie verwenden? 'pip',' conda', 'git'checkout &' setup.py'? Würden Sie auch ein virtuelles env verwenden? –

+0

Ich habe gerade 'subprocess' als Beispiel benutzt, um meine Frage zu vereinfachen. Das eigentliche Modul ist Pycurl. Ich möchte, dass das Skript nur ausgeführt wird, wenn pycurl installiert ist. Und wenn es nicht installiert ist, dann installieren Sie über Pip und dann ausführen. – jebjeb

Antwort

1

Hier ist, wie Sie überprüfen können, ob pycurl installiert ist:

# if you want to now install pycurl and run it, it is much trickier 
# technically, you might want to check if pip is installed as well 
import sys 
import pip 

def install(package): 
    pip.main(['install', package]) 

try: 
    import pycurl 
except ImportError: 
    print 'pycurl is not installed, installing it now!' 
    install('pycurl') 

# not recommended because http://stackoverflow.com/questions/7271082/how-to-reload-a-modules-function-in-python 
import pycurl 
. . . . 
# better option: 
print 'just installed pycurl, please rerun this script at your convenience' 
sys.exit(1) 
+0

Vielen Dank 2ps. Genau das, was ich brauche. – jebjeb

+0

Dies funktioniert nicht, wenn die Art und Weise, wie das '' pycurl''-Paket installiert wird, davon abhängt, dass eine '.pth''-Datei im' 'site-packages''-Verzeichnis aktualisiert/erstellt wird. Dies liegt daran, dass das Verzeichnis, das durch die '.pth'' Datei angegeben wird, normalerweise zu' 'sys.path'' beim Python Start hinzugefügt wird. Sie würden diesen Pfad immer noch vermissen, um das Modul zu finden, wenn es so installiert wurde, dass die Datei '.pth' benötigt wird. Es mag funktionieren, vielleicht nicht. Kommt darauf an, wie das Modul installiert wird. –

Verwandte Themen