Antworten:
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
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-pip
wie von Zack Titan im folgenden Kommentar vorgeschlagen , numpy
verwenden
pip install numpy
Warnung: Es wird dringend empfohlen, Python-Module nur mit dem offiziellen Ubuntu-Repository zu installieren und die pip
Methode nicht als Superuser (dh als root
oder 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 pip
lokalen virtuellen Umgebung.
vpython
Sie es beispielsweise alssudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; es kann Systempython brechen. Verwenden Sie apt-get, um Pakete für Systempython zu installieren. Sie können pip --user
option oder virtualenv verwenden, um Python-Pakete für sich selbst zu installieren.
Falls wir ein fragliches Modul nicht ungewollt importieren möchten (was in einer try
Anweisung passieren würde ), können wir sys.modules
Module 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 True
diesen Test bestehen, alle anderen Module (auch wenn installiert) führen zuFalse.
Eine andere Alternative zu try
einer import
Anweisung 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.modules
Wörterbuch hinzufügen, indem wir sie einmal importieren.
sys.modules
nur 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/except
und trap ImportError
, wie mehrere andere bereits vorgeschlagen haben.
sys.modules
ist, völlig irrelevant ist und ich denke, dass jede Erwähnung davon irreführend ist. Aber vielleicht bin das nur ich.
sys.modules
ist hier keine hilfe.
Ein anderer Weg ist das pkgutil
Modul. Funktioniert mit Python 2 und 3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
Sie müssen durch module
den Namen Ihres Moduls ersetzen , Beispiel:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
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)
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-pip
Wenn 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>
pip show <module-name>
wird angezeigt, ob ein Paket installiert ist, z pip show numpy
.
Sie könnten den Code einbauen try
, except
blockieren.
$ 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
Um eine andere Antwort zu geben, zur Vervollständigung:
Sie können die -m
Option (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 grep
dazu 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 -m
es gedacht war. aber es ist die Methode, die am wenigsten Eingabe erfordert, wenn Sie einen schnellen Test wünschen :-)
grep -q
macht die Umleitung auf null unnötig.
/dev/null
Laufe der Jahre viele nutzlose Weiterleitungen an getippt : - /
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'])
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 1
und umkehren, 0
weil 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.
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
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
Dies pip show ...
scheint der einfachste Weg zu sein:
https://pip.pypa.io/en/stable/reference/pip_show/
Aber es ist still (dh es gibt nichts zurück), wenn das Paket nicht installiert ist.