Frage

Was ist ein guter Weg, um zu überprüfen, ob ein Paket, während in einer Python-Skript installiert ist? Ich weiß, es ist einfach, vom Dolmetscher, aber ich brauche es in einem Skript zu tun.

Ich glaube, ich überprüfen könnte, wenn auf dem System ein Verzeichnis ist, die während der Installation erstellt wird, aber ich fühle mich wie es eine bessere Art und Weise ist. Ich versuche, das Skype4Py Paket, um sicherzustellen, installiert ist, und wenn nicht, werde ich es installieren.

Meine Ideen zur Durchführung des Check

  • prüfen, ob ein Verzeichnis in den typischen Installationspfad
  • versuchen, das Paket zu importieren und wenn eine Ausnahme werfen, dann installieren Paket
War es hilfreich?

Lösung

Wenn Sie einen Python-Skript bedeuten, nur so etwas tun:

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

Andere Tipps

aktualisiert Antwort

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",
]

Überprüfen Sie, ob requests installiert ist:

if 'requests' in installed_packages:
    # Do something

Warum diese Art und Weise? Manchmal haben Sie App-Namen Kollisionen. Importieren aus dem App-Namespace nicht gibt Ihnen das vollständige Bild von dem, was auf dem System installiert ist.

Alte Antwort

Ein besserer Weg, dies zu tun ist:

import pip
installed_packages = pip.get_installed_distributions()

Für pip> = 10.x Verwendung:

from pip._internal.utils.misc import get_installed_distributions

Warum diese Art und Weise? Manchmal haben Sie App-Namen Kollisionen. Importieren aus dem App-Namespace nicht gibt Ihnen das vollständige Bild von dem, was auf dem System installiert ist.

Als Ergebnis erhalten Sie eine Liste von pkg_resources.Distribution Objekten. Sehen Sie im folgenden als Beispiel:

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 vor:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

Überprüfen Sie, ob requests installiert ist:

if 'requests' in flat_installed_packages:
    # Do something

Wie von Python 3.3, können Sie die find_spec () Methode

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")

Wenn Sie das Häkchen aus dem Terminal haben wollen, können Sie ausführen

pip3 show package_name

und wenn nichts zurückgegeben wird, wird das Paket nicht installiert.

Wenn vielleicht wollen Sie diese Prüfung automatisieren, so dass zum Beispiel Sie es, wenn sie fehlt installieren können, können Sie das folgende in Ihrem Bash-Skript haben:

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

Als Erweiterung diese Antwort :

Für Python 2. *, pip show <package_name> wird die gleiche Aufgabe erfüllen.

Zum Beispiel pip show numpy kehrt die folgende oder gleich:

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: numpy-discussion@scipy.org
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 die pkg_resources Modul von Setuptool 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 es einen Unterschied zwischen Python-Modul und ein Python-Paket. Ein Paket kann mehrere Module enthält und Modulnamen können die Paketnamen nicht überein.

Ich möchte einige Gedanken / Befunde von mir zu diesem Thema hinzuzufügen. Ich schreibe ein Skript, das alle Voraussetzungen für ein maßgeschneidertes Programm überprüft. Es gibt viele Kontrollen mit Python-Modulen zu.

Es gibt ein kleines Problem mit dem

try:
   import ..
except:
   ..

Lösung. In meinem Fall eine der Python-Modulen python-nmap genannt, aber Sie importieren es mit import nmap und wie Sie den Namen Mismatch zu sehen. Daher ist der Test mit der obigen Lösung liefert ein falsches Ergebnis, und es importiert auch das Modul auf Hit, aber vielleicht keine Notwendigkeit, vielen Speicher für eine einfache Prüfung / Überprüfung zu verwenden.

Ich fand auch, dass

import pip
installed_packages = pip.get_installed_distributions()

installed_packages haben nur die Pakete, wurde mit pip installiert . Auf meinem System pip freeze 40 Python-Modulen liefern über, während installed_packages nur 1 hat, die, die ich manuell installiert (Python-nmap).

Eine andere Lösung unter, dass ich weiß, dass es kann auf die Frage nicht relevant , aber ich denke, es ist eine gute Praxis zu halten die Testfunktion getrennt aus der Gefahr, dass die durchführt installieren könnte es für einige nützlich sein.

Die Lösung, die für mich gearbeitet. Es basiert auf dieser Antwort Wie kann man überprüfen, 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 nicht das Modul mit dem Namen python-nmap finden, ich habe nmap zu verwenden, anstatt (leicht zu leben), aber in diesem Fall wird das Modul nicht überhaupt in den Speicher geladen wird

Wenn Sie Ihr Skript möchten fehlende Pakete zu installieren und weiter, Sie so etwas tun könnte (am Beispiel von ‚krbV‘ Modul in ‚Python-krbV‘ Paket):

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))

Eine schnelle Art und Weise verwenden Python Kommandozeilen-Tool. Geben Sie einfach import <your module name> Sie sehen einen Fehler, wenn Modul fehlt.

$ 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
$

Gehen Sie Option # 2. Wenn ImportError geworfen wird, dann wird das Paket nicht installiert ist (oder nicht in sys.path).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top