Wie kann ich überprüfen, ob ein Paket in einem Python-Skript installiert ist? Ich weiß, dass es vom Dolmetscher einfach ist, aber ich muss es innerhalb eines Skripts tun.
Ich vermute, ich könnte überprüfen, ob sich auf dem System ein Verzeichnis befindet, das während der Installation erstellt wurde, aber ich glaube, es gibt einen besseren Weg. Ich versuche, sicherzustellen, dass das Skype4Py-Paket installiert ist, und falls nicht, installiere ich es.
Meine Ideen zur Durchführung der Prüfung
Wenn Sie ein Python-Skript meinen, tun Sie einfach Folgendes:
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
Ein besserer Weg, dies zu tun, ist:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
Das Ergebnis:
print(installed_packages)
[
"Django",
"six",
"requests",
]
Prüfen Sie, ob requests
installiert ist:
if 'requests' in installed_packages:
# Do something
Warum so? Manchmal gibt es App-Namenskollisionen. Beim Importieren aus dem App-Namespace erhalten Sie nicht den vollständigen Überblick über die auf dem System installierten Komponenten.
Ein besserer Weg, dies zu tun, ist:
import pip
installed_packages = pip.get_installed_distributions()
Für pip> = 10.x verwenden Sie:
from pip._internal.utils.misc import get_installed_distributions
Warum so? Manchmal gibt es App-Namenskollisionen. Beim Importieren aus dem App-Namespace erhalten Sie nicht den vollständigen Überblick über die auf dem System installierten Komponenten.
Als Ergebnis erhalten Sie eine Liste von pkg_resources.Distribution
-Objekten. Sehen Sie sich folgendes als Beispiel an:
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",
]
Prüfen Sie, ob requests
installiert ist:
if 'requests' in flat_installed_packages:
# Do something
Wenn Sie die Überprüfung vom Terminal erhalten möchten, können Sie ausführen
pip3 show package_name
und wenn nichts zurückgegeben wird, wird das Paket nicht installiert.
Wenn Sie diese Prüfung vielleicht automatisieren möchten, um sie bei Bedarf zu installieren, können Sie Folgendes in Ihrem Bash-Skript verwenden:
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
Ab Python 3.3 können Sie die Methode find_spec () verwenden
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")
Als Erweiterung von dieser Antwort :
Für Python 2. * führt pip show <package_name>
dieselbe Aufgabe aus.
Zum Beispiel gibt pip show numpy
folgendes oder ähnliches zurück:
Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: [email protected]
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires:
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy
Sie können das Modul pkg_resources von setuptools verwenden. Zum Beispiel:
import pkg_resources
package_name = 'cool_package'
try:
cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
print('{} not installed'.format(package_name))
else:
print(cool_package_dist_info)
Beachten Sie, dass sich das Python-Modul von einem Python-Paket unterscheidet. Ein Paket kann mehrere Module enthalten, und die Namen der Module stimmen möglicherweise nicht mit dem Paketnamen überein.
Ich möchte einige Gedanken/Erkenntnisse von mir zu diesem Thema hinzufügen ... Ich schreibe ein Skript, das alle Anforderungen für ein maßgeschneidertes Programm überprüft. Es gibt auch viele Prüfungen mit Python-Modulen.
Es gibt ein kleines Problem mit dem
try:
import ..
except:
..
lösung. In meinem Fall eines der Python-Module mit dem Namen python-nmap
, aber Sie importieren es mit import nmap
und wenn die Namen nicht übereinstimmen. Daher gibt der Test mit der obigen Lösung ein False-Ergebnis zurück und importiert auch das Modul bei einem Treffer. Möglicherweise wird jedoch nicht viel Speicher für einen einfachen Test/Check benötigt.
Das habe ich auch gefunden
import pip
installed_packages = pip.get_installed_distributions()
installed_packages
wird haben nur die Pakete wurden installiert mit pip. Auf meinem System wird pip freeze
über 40
Python-Module zurückgegeben, während installed_packages
nur 1
hat, den ich manuell installiert habe (Python) -nmap).
Eine andere Lösung, die ich kenne, ist ist möglicherweise nicht relevant für die Frage, aber ich denke, es ist eine gute Praxis, die Testfunktion getrennt zu halten von der, die die Installation durchführt, es könnte nützlich sein für einige.
Die Lösung, die für mich funktioniert hat. Es basiert auf dieser Antwort So prüfen Sie, ob ein Python-Modul vorhanden ist, ohne es zu importieren
from imp import find_module
def checkPythonmod(mod):
try:
op = find_module(mod)
return True
except ImportError:
return False
HINWEIS: Diese Lösung kann das Modul auch nicht mit dem Namen python-nmap
finden. Ich muss stattdessen nmap
verwenden (einfach zu leben), aber in diesem Fall wird das Modul nicht in den Speicher geladen.
Ein schneller Weg ist die Verwendung von python Befehlszeilenwerkzeug . Geben Sie einfach import <your module name>
.__ ein. Wenn das Modul fehlt, wird ein Fehler angezeigt.
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
>>> import sys
>>> import jocker
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$
Wenn Sie möchten, dass Ihr Skript fehlende Pakete installiert und fortsetzt, können Sie Folgendes tun (am Beispiel des Moduls 'krbV' 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))