2009-06-26 11 views
63

Was ist eine gute Möglichkeit zu überprüfen, ob ein Paket in einem Python-Skript installiert ist? Ich weiß, dass es für den Dolmetscher einfach ist, aber ich muss es in einem Skript machen.Überprüfen Sie, ob das Python-Paket installiert ist

Ich könnte überprüfen, ob es ein Verzeichnis auf dem System gibt, das während der Installation erstellt wird, aber ich habe das Gefühl, es gibt einen besseren Weg. Ich versuche sicherzustellen, dass das Skype4Py-Paket installiert ist, und wenn nicht, werde ich es installieren.

Meine Ideen für die Prüfung erreichen

  • Prüfung für ein Verzeichnis im typischen Installationspfad
  • versuchen, das Paket zu importieren und wenn eine Ausnahme werfen, dann Paket
+0

Welche Art von Skript? – Christopher

+0

Schreiben eines Python-Skripts zum automatischen Starten von Skype und Verwenden von tcpdump zum Sammeln von Paketdaten, damit ich analysieren kann, wie das Netzwerk funktioniert, wenn Sie eine Telefonkonferenz führen. – Kevin

Antwort

70

Wenn Sie ein Python-Skript bedeuten, nur so etwas tun:

try: 
import mymodule 
except ImportError, e: 
pass # module doesn't exist, deal with it. 
+0

Danke, sehr geschätzt. – Kevin

+4

Warnung: Ich hatte gerade eine Situation, in der der ImportError innerhalb des Moduls selbst ausgelöst wurde. Dies sollte nicht oft vorkommen, aber bedenken Sie, dass diese Prüfung nicht in allen Fällen zuverlässig ist. –

+3

Dies überprüft nicht nur *; es importiert es auch; siehe auch http://stackoverflow.com/questions/14050281/how-to-check-if-a-python-module-exists-without-importing-it –

-2

Go installieren Option 2. Wenn ImportError ausgelöst wird, ist das Paket nicht installiert (oder nicht in sys.path).

34

einen besseren Weg, dies zu tun ist:

import pip 
installed_packages = pip.get_installed_distributions() 

Warum diese Weise? Manchmal gibt es App-Namenskonflikte. Beim Importieren aus dem App-Namespace erhalten Sie nicht das vollständige Bild dessen, was auf dem System installiert ist.

Als Ergebnis erhalten Sie eine Liste von pkg_resources.Distribution Objekte. Sehen Sie im folgenden als Beispiel:

print installed_packages 
[ 
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)", 
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)", 
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)", 
] 

Machen Sie eine Liste davon:

flat_installed_packages = [package.project_name for package in installed_packages] 

[ 
    "Django", 
    "six", 
    "requests", 
] 

Überprüfen Sie, ob requests installiert ist:

if 'requests' in flat_installed_packages: 
    # Do something 
+0

Wie in der anderen Antwort erwähnt, ist es möglich, dass der Fehler nicht abgefangen wird. Daher denke ich, dass dies die akzeptierte Antwort sein sollte. –

6

Ab Python 3.3 können Sie die find_spec() verwenden Methode

import importlib.util 
import sys 

# For illustrative purposes. 
package_name = 'pandas' 

spec = importlib.util.find_spec(package_name) 
if spec is None: 
    print(package_name +" is not installed") 
0

Ich möchte einige meiner Gedanken zu diesem Thema hinzufügen. Ich schreibe ein Skript, das alle Anforderungen für ein benutzerdefiniertes Programm überprüft. Es gibt viele Überprüfungen mit Python-Modulen.

Es gibt ein kleines Problem mit der

try: 
    import .. 
except: 
    .. 

Lösung. In meinem Fall eines der Python-Module namens python-nmap, aber Sie importieren es mit import nmap und wie Sie sehen, die Namen stimmen nicht überein. Daher gibt der Test mit der obigen Lösung ein False-Ergebnis zurück, und es importiert auch das Modul beim Treffer, aber möglicherweise ist es nicht notwendig, viel Speicher für einen einfachen Test/Check zu verwenden.

Ich fand auch, dass

import pip 
installed_packages = pip.get_installed_distributions() 

installed_packages nur die Pakete haben hat mit pip installiert. Auf meinem System pip freeze kehrt über 40 Python-Module, während installed_packages nur 1, die ich manuell installiert (Python-nmap).

Eine andere Lösung unten, dass ich es wissen kann auf die Frage nicht relevant, aber ich denke, es ist zu eine gute Praxis ist halten die Testfunktion getrennt von dem einen, dass die es für einige könnte nützlich sein, installieren führt.

Die Lösung, die für mich arbeitete. Es basierte auf dieser Antwort How to check if a python module exists without importing it

from imp import find_module 

def checkPythonmod(mod): 
    try: 
     op = find_module(mod) 
     return True 
    except ImportError: 
     return False 

Hinweis: Diese Lösung kann nicht das Modul mit dem Namen findet python-nmap auch, ich habe stattdessen nmap zu verwenden (leicht zu leben), aber in diesem Fall das Modul nicht in den Speicher geladen werden.

5

Wenn Sie das Häkchen aus dem Terminal haben wollen, können Sie

pip3 show package_name 

laufen und wenn nichts zurückgegeben wird, wird das Paket nicht installiert.

Wenn vielleicht wollen Sie diese Prüfung automatisieren, so dass zum Beispiel Sie es, wenn sie fehlt installieren können, können Sie das folgende in Ihrem Bash-Skript haben:

pip3 show package_name 1>/dev/null #pip for Python 2 
if [ $? == 0 ]; then 
    echo "Installed" #Replace with your actions 
else 
    echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ? 
fi 
0

Wenn Sie Ihr Skript installieren möchten fehlende Pakete und fortfahren, könnten Sie so etwas tun (am Beispiel des 'krbV'-Moduls im Paket' python-krbV '):

import pip 
import sys 

for m, pkg in [('krbV', 'python-krbV')]: 
    try: 
     setattr(sys.modules[__name__], m, __import__(m)) 
    except ImportError: 
     pip.main(['install', pkg]) 
     setattr(sys.modules[__name__], m, __import__(m))