Wie überprüfe ich, ob ein Modul in Python installiert ist, und installiere es bei Bedarf?

89

Woher weiß ich im Terminal nach dem Start von Python, welche Module in Python vorhanden sind? Angenommen, ich muss die Module NumPy und SciPy lernen.

  • Wie installiere ich es, wenn es nicht installiert ist?
  • Woher weiß ich, ob es bereits installiert ist?
TechJhola
quelle

Antworten:

73

Wie Sie feststellen können , ob ein Python-Modul im System installiert ist oder nicht: Sie können einen sehr einfachen Test im Terminal durchführen.

$ python -c "import math"
$ echo $?
0                                # math module exists in system

$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1                                # numpy module does not exist in system

Wie installiere ich es, wenn es nicht installiert ist?

Sie können ein bestimmtes Modul installieren, indem Sie die entsprechenden Pakete aus dem Repository herunterladen. Beispielsweise können Sie installierenscipy als:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Alternativ können Sie auch ein Python-Modul installieren, indem Sie, python-pipwie von Zack Titan im folgenden Kommentar vorgeschlagen , numpyverwenden

pip install numpy

Warnung: Es wird dringend empfohlen, Python-Module nur mit dem offiziellen Ubuntu-Repository zu installieren und die pipMethode nicht als Superuser (dh als rootoder mit sudo) zu verwenden. In einigen Fällen kann es passieren, dass Ihr System unbrauchbar wird, indem Sie Systempython unterbrechen.

So installieren Sie Pakete mithilfe der piplokalen virtuellen Umgebung.

souravc
quelle
Wie in Ihrer Antwort existiert ein Mathematikmodul und für numby ist der Traceback nicht erschienen und für echo $? Ausgabe war 0, Bedeutet dies, dass auch in meinem System eine Anzahl vorhanden ist?
TechJhola
1
Ja, es ist in Ihrem System vorhanden.
Souravc
Falls Sie das Modul nicht haben, wie werden Sie es importieren? Wenn wir die Codierung durchführen, rufen wir die import-Anweisung von numpy import * auf. Wird das Modul installiert? Wenn nicht, wie werden wir ein neues Modul installieren?
TechJhola
1
Es wird eine separate Frage sein, wie ein Modul installiert wird. Benötigen Sie verschiedene Pakete für verschiedene Module. Zum Installieren müssen vpythonSie es beispielsweise alssudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc
1
nicht benutzen sudo pip; es kann Systempython brechen. Verwenden Sie apt-get, um Pakete für Systempython zu installieren. Sie können pip --useroption oder virtualenv verwenden, um Python-Pakete für sich selbst zu installieren.
jfs
21

Falls wir ein fragliches Modul nicht ungewollt importieren möchten (was in einer tryAnweisung passieren würde ), können wir sys.modulesModule testen, die installiert sind und zuvor importiert wurden.

In der Python-Shell-Ausgabe:

>>> import sys

Dann testen Sie nach installierten Modulen:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Beachten Sie, dass nur die zuvor importierten Module Truediesen Test bestehen, alle anderen Module (auch wenn installiert) führen zuFalse.

Eine andere Alternative zu tryeiner importAnweisung in der Python-Konsole ist der Aufruf der eingebauten help()Funktion. Dies wird keine Dokumentation für nicht installierte Module geben, z

>>> help('scipy')
no Python documentation found for 'scipy'

Die Ausgabe sehr langer Hilfedokumente von installierten Modulen kann mit unterbrochen werden Q.

Um nun fehlende Module zu installieren, wird empfohlen, die Ubuntu-Paketverwaltung (und nicht die Python-Pip-Methode) zu verwenden, da wir Root-Zugriff benötigen und außerdem verhindern, dass unser stark von Python abhängiges System durcheinandergebracht wird. Für das betreffende Modul wäre dies zB:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Nach der Installation können wir sie dem sys.modulesWörterbuch hinzufügen, indem wir sie einmal importieren.

Takkat
quelle
1
Ich denke, das ist die pythonischste Antwort ...
Grijesh Chauhan
3
Der erste Teil ist falsch: Es werden sys.modulesnur Module angezeigt, die bereits importiert wurden. Auf diese Weise kann nicht zuverlässig überprüft werden, ob ein Modul installiert wurde. Der zuverlässigste Test ist die Verwendung von a try/exceptund trap ImportError, wie mehrere andere bereits vorgeschlagen haben.
ekhumoro
@ekhumoro - danke, ich bearbeite meine Antwort, um das klarer zu machen.
Takkat
4
Es scheint immer noch nicht klar genug. Angesichts der Tatsache, dass die Frage, wie man herausfindet, ob ein Modul installiert (nicht importiert ) sys.modulesist, völlig irrelevant ist und ich denke, dass jede Erwähnung davon irreführend ist. Aber vielleicht bin das nur ich.
David Z
1
sys.modulesist hier keine hilfe.
Katze
19

Ein anderer Weg ist das pkgutilModul. Funktioniert mit Python 2 und 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Sie müssen durch moduleden Namen Ihres Moduls ersetzen , Beispiel:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
cuonglm
quelle
2
Ich habe gesehen, wie du einige meiner Änderungen rückgängig gemacht hast. print()wird auch gut funktionieren in Python 2; Es wird wie die Group-with-Parens-Syntax behandelt und hat keine Nebenwirkungen. Nur wenn Sie mehrere Elemente hinzufügen möchten (wie print('a', 'b')es als ein behandelt wird tuple, in dem Sie das benötigen from __future__ import print_function, aber das ist in diesem Fall nicht zutreffend), können Sie einfach vorwärtskompatiblen Code schreiben, indem Sie die Parens hinzufügen (ich habe meine Änderungen getestet) in Python 2 und 3)
Martin Tournoij
@Carpetsmoker: Danke für den Hinweis. Ich kehre zur alten Version zurück.
Donnerstag,
Das ist eine großartige Antwort. Ich habe eine abgeleitete Antwort hinzugefügt, die einen Exit- / Statuscode (für die Ablaufsteuerung von Shell-Skripten) zurückgibt und den Modulnamen als Befehlszeilenargument verwendet. askubuntu.com/a/891384/146273
Bruno Bronosky
Das hat funktioniert! - Wechseln exitSie einfach zu, damit es im Shell-Kontext verwendet werden kann:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

Ich weiß, dass das OP ursprünglich nach dem Start von Python nach einer Lösung gefragt hat, aber außerhalb von Python verwende ich pip. Auf Ubuntu: sudo apt-get install python-pipWenn es nicht bereits installiert ist.

Um zu sehen, welche Module von Drittanbietern verfügbar sind, führen Sie einfach Folgendes aus:

pip freeze

Oder auch

pip list

Und beide zeigen Ihnen alle installierten Module und ihre Versionen.

Wenn das gesuchte Modul nicht installiert ist, können Sie es die meiste Zeit problemlos mit pip installieren:

pip install <module-name>

Wenn Sie nicht sicher sind, ob ein Modul existiert oder wie sein PyPI-Name lautet, verwenden Sie pip search:

pip search <keyword>
OozeMeister
quelle
1
Außerdem pip show <module-name>wird angezeigt, ob ein Paket installiert ist, z pip show numpy.
Herpes Free Engineer
10

Sie könnten den Code einbauen try, exceptblockieren.

$ python3 -c "\
try:
    import cow  
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

There was no such module installed

$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
Avinash Raj
quelle
6

Um eine andere Antwort zu geben, zur Vervollständigung:

Sie können die -mOption (ab) verwenden . Aus Pythons Manpage:

   -m module-name
          Searches sys.path for the named module and runs the  correspond
          ing .py file as a script.

Welches wird uns geben:

$ python2 -m numpy
/sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed

$ python2 -m math
/sbin/python2: No code object available for math

Aber für nicht existierende Module gibt es uns:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Wir könnten grepdazu passen:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Nope

$ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Yup

Das ist etwas hackig und nicht das, wofür -mes gedacht war. aber es ist die Methode, die am wenigsten Eingabe erfordert, wenn Sie einen schnellen Test wünschen :-)

Martin Tournoij
quelle
4
grep -qmacht die Umleitung auf null unnötig.
muru
3
@muru Yikes! Ich habe im /dev/nullLaufe der Jahre viele nutzlose Weiterleitungen an getippt : - /
Martin Tournoij
4

Ich habe ein Beispiel in Python geschrieben:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
Mona Jalal
quelle
3

Shell-Oneliner-Check (nützlich für die Bereitstellung)

Ich habe festgestellt, dass ich in der Lage sein muss, in einem Oneliner nach einem Paket aus der Shell zu suchen, um meine Infrastrukturbereitstellung ** idempotent zu machen. Ich habe auf @ cuonglms Antwort aufgebaut. Ich musste das 1und umkehren, 0weil ich einen Exit-Status erzeuge, anstatt einen String zu drucken.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Sie könnten den Namen sys.argv[1]durch den Namen Ihres Pakets in einfachen Anführungszeichen ersetzen , aber für meine Bereitstellungsskripte mag ich die Lesbarkeit, wenn ich ihn am Ende habe.

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

** Ich weiß , dass Chef , Puppet und Ansible Plugins für die Verwaltung von Python-Paketen haben, aber Sie befinden sich möglicherweise in einer Situation wie mir, in der Sie eine veraltete Version verwenden und keine veralteten Plugins verwenden möchten.

Bruno Bronosky
quelle
1

Man kann auch verwenden pydoc modules, mit dem gefiltert werden kann grep, um ein bestimmtes Modul zu finden. Die Ausgabe wird in Spaltenform angezeigt. Der einzige Nachteil dieses Ansatzes ist, dass er auch Python-Dateien im aktuellen Arbeitsverzeichnis enthält. Trotzdem benutze ich es die meiste Zeit selbst und es ist einer der häufig zitierten Ansätze zu dieser verwandten Frage: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
quelle
0

Aus der Ubuntu-Shell, standardmäßig bash, so einfach wie

pip list | grep <package-name-Case-Matters>

Beispiele

pip list | grep pywinrm

pip list | grep numpy

Und wenn Sie Zweifel an der Schreibweise haben (obwohl ich denke, dass alle Paketnamen immer in Kleinbuchstaben geschrieben sind):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy
xCovelus
quelle