Wie kann überprüft werden, ob ein Paket in einem Python-Skript installiert ist? Ich weiß, dass es vom Dolmetscher einfach ist, aber ich muss es in einem Skript tun.
Ich denke, ich könnte überprüfen, ob es ein Verzeichnis auf dem System gibt, das während der Installation erstellt wurde, aber ich denke, es gibt einen besseren Weg. Ich versuche sicherzustellen, dass das Skype4Py-Paket installiert ist, und wenn nicht, werde ich es installieren.
Meine Ideen zur Durchführung der Prüfung
- Suchen Sie nach einem Verzeichnis im typischen Installationspfad
- Versuchen Sie, das Paket zu importieren. Wenn eine Ausnahme ausgelöst wird, installieren Sie das Paket
python
package
skype
python-import
Kevin
quelle
quelle
Antworten:
Wenn Sie ein Python-Skript meinen, machen Sie einfach so etwas:
Python 3:
Python 2:
quelle
Antwort aktualisiert
Ein besserer Weg, dies zu tun, ist:
Das Ergebnis:
Überprüfen Sie, ob
requests
installiert ist:Warum so? Manchmal kommt es zu Kollisionen mit App-Namen. Beim Importieren aus dem App-Namespace erhalten Sie kein vollständiges Bild davon, was auf dem System installiert ist.
Beachten Sie, dass die vorgeschlagene Lösung funktioniert:
pip install http://some.site/package-name.zip
einem anderen Archivtyp ).python setup.py install
.sudo apt install python-requests
.Fälle, in denen es möglicherweise nicht funktioniert:
python setup.py develop
.pip install -e /path/to/package/source/
.Alte Antwort
Ein besserer Weg, dies zu tun, ist:
Für pip> = 10.x verwenden Sie:
Warum so? Manchmal kommt es zu Kollisionen mit App-Namen. Beim Importieren aus dem App-Namespace erhalten Sie kein vollständiges Bild davon, was auf dem System installiert ist.
Als Ergebnis erhalten Sie eine Liste von
pkg_resources.Distribution
Objekten. Sehen Sie sich als Beispiel Folgendes an:Machen Sie eine Liste davon:
Überprüfen Sie, ob
requests
installiert ist:quelle
import json
tatsächlich funktioniert). Die Methode von ice.nicer funktioniert in diesem Fall.if "u'requests'" in installed_packages:
von Updated Answer verwenden, um für mich zu arbeiten. Die Ausgabe vonprint()
erzeugt dies auf meinem macOS Python:[..., u'pytz', u'requests', ...]
if "requests'"
(beachten Sie das einfache Anführungszeichen am Ende). macht überhaupt keinen Sinn.pip
. Sie können beispielsweise ein Paket aus dem Quellcode erstellen und installieren. Diese Antwort wird diese nicht finden. Die Antwort von @ ice.nicerfind_spec()
ist richtig.Ab Python 3.3 können Sie die Methode find_spec () verwenden
quelle
importlib.util.find_spec('google-cloud-logging')
Findet nichts, solangeimportlib.util.find_spec('google.cloud.logging')
gefunden wird. Der offizielle Name und Name, den Pip anzeigt, ist mit Bindestrichen, nicht mit Punkten. Könnte verwirrend sein, daher mit Vorsicht verwenden.Wenn Sie die Prüfung vom Terminal aus erhalten möchten, können Sie sie ausführen
und wenn nichts zurückgegeben wird, wird das Paket nicht installiert.
Wenn Sie diese Überprüfung möglicherweise automatisieren möchten, damit Sie sie beispielsweise installieren können, wenn sie fehlt, können Sie Folgendes in Ihr Bash-Skript einfügen:
quelle
if
, um einen erfolgreichen Befehl direkt zu testen:if pip3 show package_name 1>/dev/null; then ...
Als Erweiterung dieser Antwort :
Führt für Python 2. *
pip show <package_name>
dieselbe Aufgabe aus.Zum Beispiel
pip show numpy
wird Folgendes oder ähnliches zurückgegeben:quelle
Sie können das Modul pkg_resources von setuptools verwenden. Beispielsweise:
Beachten Sie, dass es einen Unterschied zwischen dem Python-Modul und einem Python-Paket gibt. Ein Paket kann mehrere Module enthalten, und die Namen der Module stimmen möglicherweise nicht mit dem Paketnamen überein.
quelle
Öffnen Sie Ihren Eingabeaufforderungstyp
quelle
Ich möchte diesem Thema einige meiner Gedanken / Erkenntnisse hinzufügen. Ich schreibe ein Skript, das alle Anforderungen für ein benutzerdefiniertes Programm überprüft. Es gibt auch viele Prüfungen mit Python-Modulen.
Es gibt ein kleines Problem mit dem
Lösung. In meinem Fall hat eines der Python-Module aufgerufen
python-nmap
, aber Sie importieren es mitimport nmap
und wie Sie sehen, stimmen die Namen nicht überein. Daher gibt der Test mit der oben genannten Lösung ein falsches Ergebnis zurück und importiert das Modul bei einem Treffer, benötigt jedoch möglicherweise nicht viel Speicher für einen einfachen Test / eine einfache Überprüfung.Das habe ich auch gefunden
installed_packages
wird haben nur die Pakete wurde mit pip installiert . Auf meinem Systempip freeze
kehrt über40
Python-Module zurück, währendinstalled_packages
nur1
das manuell installierte (python-nmap) vorhanden ist.Eine andere Lösung, von der ich weiß, dass sie für die Frage möglicherweise nicht relevant ist , aber ich denke, es ist eine gute Praxis , die Testfunktion von der zu trennen , die die Installation durchführt, die für einige nützlich sein könnte.
Die Lösung, die für mich funktioniert hat. Basierend auf dieser Antwort So überprüfen Sie, ob ein Python-Modul vorhanden ist, ohne es zu importieren
HINWEIS: Diese Lösung kann das Modul auch nicht anhand des Namens
python-nmap
finden. Ich muss esnmap
stattdessen verwenden (einfach zu handhaben ), aber in diesem Fall wird das Modul überhaupt nicht in den Speicher geladen.quelle
Wenn Sie möchten, dass Ihr Skript fehlende Pakete installiert und fortfährt, können Sie Folgendes tun (am Beispiel des Moduls 'krbV' im Paket 'python-krbV'):
quelle
Eine schnelle Möglichkeit ist die Verwendung des Python- Befehlszeilentools. Einfach eingeben
import <your module name>
Sie sehen einen Fehler, wenn das Modul fehlt.quelle
Hmmm ... das, was ich einer bequemen Antwort am nächsten kam, war die Verwendung der Befehlszeile, um den Import zu versuchen. Aber das vermeide ich lieber.
Wie wäre es mit 'Pip Freeze | grep pkgname '? Ich habe es versucht und es funktioniert gut. Es zeigt Ihnen auch die Version, die es hat, und ob es unter Versionskontrolle (Installation) oder bearbeitbar (Entwicklung) installiert ist.
quelle
Klasse myError (Ausnahme): pass #oder etwas tun versuchen: mymodule außer ImportError importieren als e: myError auslösen ("Fehler ist aufgetreten")
quelle
Im Terminaltyp
Beispiel
quelle
Ich möchte die Antwort von @ ice.nicer kommentieren, kann dies aber nicht. Meine Beobachtungen sind, dass Pakete mit Bindestrichen mit Unterstrichen gespeichert werden, nicht nur mit Punkten, wie im Kommentar von @dwich hervorgehoben
Zum Beispiel
pip3 install sphinx-rtd-theme
, aber:importlib.util.find_spec(sphinx_rtd_theme)
gibt ein Objekt zurückimportlib.util.find_spec(sphinx-rtd-theme)
gibt None zurückimportlib.util.find_spec(sphinx.rtd.theme)
löst ModuleNotFoundError ausAußerdem werden einige Namen komplett geändert. Zum Beispiel tun Sie dies,
pip3 install pyyaml
aber es wird einfach als gespeichertyaml
Ich benutze Python3.8
quelle
quelle
Gehen Sie zu Option 2. Wenn
ImportError
es geworfen wird, ist das Paket nicht installiert (oder nicht insys.path
).quelle