it-swarm.com.de

Überprüfen Sie, ob das Python-Paket installiert ist

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

  • suchen Sie nach einem Verzeichnis im typischen Installationspfad
  • versuchen Sie, das Paket zu importieren. Wenn eine Ausnahme ausgelöst wird, installieren Sie das Paket
80
Kevin

Wenn Sie ein Python-Skript meinen, tun Sie einfach Folgendes:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.
80
Christopher

Antwort aktualisiert

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.

Alte Antwort

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
39

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
12
Ognjen Vukovic

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")
11
ice.nicer

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
3
KutalmisB

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. 

2
Lyudmil Nenov

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.

1
Gergely M

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
$
0
Deepu Sahni

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))
0
Alexander Zhak