Wie überprüfe ich, ob ein Modul oder ein Paket bereits in Python3 installiert ist?

10

Sie müssen überprüfen, ob es installiert ist oder nicht, bevor das Programm ausgeführt werden kann.

Hubatrix
quelle
2
Führen Sie einfach die pip install. Wenn es bereits installiert ist, wird es nicht erneut installiert.
Jordanm
Thnk you jordanm, aber ich muss überprüfen und ao / p geben, dann testen.
Hubatrix

Antworten:

3

Geben Sie die Shell ein : pydoc modules.
Dadurch werden Module aufgelistet und Sie können das gewünschte Modul abrufen.
Gefunden auf Stackoverflow hier

Labyrinthe
quelle
11

Sie sollten pipden listBefehl 's mit grep verwenden, der nur installierte Pakete auflistet (nicht alle Module und auch deren Nachbarn):

pip list | grep -F package_name

Wenn package_name mit mehreren installierten Paketen übereinstimmt, z. B. nach dem botoZeitpunkt suchen, an dem botocoreauch installiert ist, kann die Verwendung von -wanstelle von -Fhelfen, wie @TaraPrasadGurung vorschlägt. Dies listet nicht das genaue Paket auf, da -wZeichen, die in Paketnamen häufig vorkommen, als Wortgrenzen angezeigt werden. Wenn Sie also oder und ruamel.yaml.cmd` installiert haben requestsund genau eine Ausgabezeile benötigen, müssen Sie Folgendes tun:requests-cacheruamel.yaml

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

Bitte beachten Sie, dass Sie, da es .bei der Verwendung mit einem beliebigen Zeichen -Eübereinstimmt, dieses maskieren müssen.¹


¹ Und ja, das ist notwendig, da es ein Paket gibt ruamel_yaml. Nicht jeder Paketmanager ist pipkompatibel, wenn es um Namespace-Pakete geht.

Anthon
quelle
Das Problem dabei ist, wenn der Paketname boto und botocore installiert sind, werden beide aufgelistet. Die bessere Lösung ist also, das Flag -w anstelle von -F zu verwenden, um das genaue Paket aufzulisten
Tara Prasad Gurung
@TaraPrasadGurung Obwohl dies dazu beitragen kann, die Ausgabe etwas zu reduzieren, hilft es nicht, das genaue Paket zu erhalten, wie Sie behaupten. ZB werden Punkt und Bindestrich -wals Wortgrenzen verwendet und sind in Paketnamen üblich. Ich bekomme mehrere Übereinstimmungen, wenn ich Ihren Vorschlag mit grep -w ruamel.yamlodergrep -w request
Anthon
pip list | grep -F mxnet-cu101druckt mxnet-cu101 1.5.0, aber nicht genau dort, wo es installiert ist. Irgendeine Idee, wie man den installierten Pfad erhält? `
Anu
@any Ja, ich habe eine gute Idee, wie ich abrufen kann, wo ein Python-Paket installiert ist, wenn ich seinen Namen kenne. Sie sollten eine Frage auf dieser Website posten und mich hier um meine Aufmerksamkeit bitten, wenn Sie dies tun, da ich neu gestellten Fragen zu U & L nicht folge.
Anthon
4

Wenn das Paket beim Importieren nichts Verrücktes oder Zeitraubendes tut, können Sie versuchen, es tatsächlich zu importieren:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi
Dmiters
quelle
2

Ich habe vorhandene Antworten unvollständig gefunden und es fehlen ausreichend gute Beispiele. Hier ist die Lösung, für die ich mich entschieden habe:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

Eine Github-Zusammenfassung dieses Beispiels finden Sie hier: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6

ShayPal5
quelle
Dies sieht einer bestehenden Antwort
Jeff Schaller
1
Der Bash-Code ist ähnlich, der Python-Code ist anders, was einen großen Unterschied macht. Ich habe alle vorhandenen Antworten gelesen, bevor ich meine eigenen hinzugefügt habe, und die spezifische Antwort, auf die Sie verlinkt haben, hat bei mir nicht funktioniert. Daher finde ich es relevant und wertvoll, meine Antwort hier hinzuzufügen. :)
ShayPal5
1

Sie können so etwas auch in Ihren Skripten verwenden.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"

Was Sie erhalten würden, wenn ein Paket nicht installiert wäre.

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

Was Sie erhalten würden, wenn ein Paket installiert wird.

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

Funktioniert in Python2 und Python3, und dann installieren Sie basierend auf dem Exit-Code.

RJ
quelle
0

Ich habe eine etwas strengere Version von Anthons Antwort zur Verwendung in einem Skript verwendet:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

Die ersten beiden Greps sollen die Header-Zeilen von der Ausgabe von pip3 entfernen.

Der Schnitt wählt dann nur die Paketnamen aus (Verwerfen der Versionsnummern).

Dann kann der endgültige Grep eine genaue Suche nach dem relevanten durchführen $package_name

Wenn das Paket gefunden wird, wird der Paketname angezeigt und mit dem Exit-Code 0 zurückgegeben. Wenn Sie den Paketnamen nicht sehen möchten, beenden Sie den Befehl mit >/dev/null

joeytwiddle
quelle
0

in einer Python-Shell / Eingabeaufforderung. ::

>>> help('modules')
Die wissenschaftliche Methode
quelle