web-dev-qa-db-fra.com

Vérifier si le paquet Python est installé

Quel est un bon moyen de vérifier si un paquet est installé alors que vous êtes dans un script Python? Je sais que c'est facile avec l'interprète, mais je dois le faire avec un script. 

Je suppose que je pourrais vérifier s’il existe un répertoire sur le système créé lors de l’installation, mais j’ai l’impression qu’il existe un meilleur moyen. J'essaie de m'assurer que le paquet Skype4Py est installé, sinon je l'installerai.

Mes idées pour accomplir le chèque

  • recherche un répertoire dans le chemin d'installation typique
  • essayez d'importer le paquet et si une exception est levée, installez le paquet
80
Kevin

Si vous voulez parler d'un script python, faites quelque chose comme ceci:

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

Réponse mise à jour

Une meilleure façon de faire est:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

Le résultat:

print(installed_packages)

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

Vérifiez si requests est installé:

if 'requests' in installed_packages:
    # Do something

Pourquoi cette façon? Parfois, vous avez des collisions de nom d'application. L'importation à partir de l'espace de noms d'applications ne vous donne pas une image complète de ce qui est installé sur le système.

Ancienne réponse

Une meilleure façon de faire est:

import pip
installed_packages = pip.get_installed_distributions()

Pour pip> = 10.x utiliser:

from pip._internal.utils.misc import get_installed_distributions

Pourquoi cette façon? Parfois, vous avez des collisions de nom d'application. L'importation à partir de l'espace de noms d'applications ne vous donne pas une image complète de ce qui est installé sur le système.

En conséquence, vous obtenez une liste d'objets pkg_resources.Distribution. Voir les exemples suivants:

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

Faites-en une liste:

flat_installed_packages = [package.project_name for package in installed_packages]

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

Vérifiez si requests est installé:

if 'requests' in flat_installed_packages:
    # Do something
39
Artur Barseghyan

Si vous voulez avoir la vérification du terminal, vous pouvez exécuter

pip3 show package_name

et si rien n'est retourné, le paquet n'est pas installé.

Si vous souhaitez peut-être automatiser cette vérification afin de pouvoir, par exemple, l'installer si elle est manquante, vous pouvez avoir les éléments suivants dans votre script bash:

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

A partir de Python 3.3, vous pouvez utiliser la méthode find_spec ()

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

En prolongement de cette réponse :

Pour Python 2. *, pip show <package_name> effectuera la même tâche.

Par exemple, pip show numpy renverra les éléments suivants ou identiques:

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

Vous pouvez utiliser le module pkg_resources de setuptools. Par exemple:

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)

Notez qu'il existe une différence entre un module python et un package python. Un package peut contenir plusieurs modules et les noms de module peuvent ne pas correspondre au nom du package. 

2
Lyudmil Nenov

J'aimerais ajouter quelques réflexions/conclusions à ce sujet… .. J'écris un script qui vérifie toutes les conditions requises pour un programme personnalisé. Il existe également de nombreuses vérifications avec les modules python. 

Il y a un petit problème avec le 

try:
   import ..
except:
   ..

solution. Dans mon cas, l’un des modules python appelé python-nmap, mais vous l’importez avec import nmap et lorsque vous voyez les noms qui ne correspondent pas. Par conséquent, le test avec la solution ci-dessus renvoie un résultat False et importe également le module en cas de réussite, mais il n'est peut-être pas nécessaire d'utiliser beaucoup de mémoire pour un simple test/contrôle.

J'ai aussi trouvé que 

import pip
installed_packages = pip.get_installed_distributions()

installed_packages aura} seuls les packages ont été installé avec pip. Sur mon système, pip freeze renvoie plus de 40 modules python, alors que installed_packages n'a que 1, celui que j'ai installé manuellement (python -nmap).

Une autre solution ci-dessous que je connais peut ne pas être pertinente pour la question, mais je pense que c'est une bonne pratique de garder la fonction de test séparée de celle qui effectue l'installation, cela peut être utile pour certains.

La solution qui a fonctionné pour moi. Il se base sur cette réponse Comment vérifier si un module python existe sans l’importer

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

REMARQUE: cette solution ne trouve pas non plus le module sous le nom python-nmap. Je dois utiliser plutôt nmap (facile à vivre), mais dans ce cas, le module ne sera pas chargé dans la mémoire.

1
Gergely M

Un moyen rapide consiste à utiliser python outil de ligne de commande . Tapez simplement import <your module name>Vous voyez une erreur si un module est manquant.

$ 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

Si vous voulez que votre script installe les paquetages manquants et continue, vous pouvez faire quelque chose comme ceci (exemple du module 'krbV' dans le paquet '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