115 votes

Comment puis-je vérifier si un module est installé dans Python, et l'installer si nécessaire ?

En terminal, après avoir démarré Python, comment vais-je savoir quels sont les modules présents dans Python ? Supposons que je doive apprendre les modules NumPy et SciPy.

  • Comment vais-je l'installer s'il n'est pas installé ?
  • Comment puis-je savoir s'il est déjà installé ?

8voto

Martin Tournoij Points 234

Pour fournir une autre réponse, par souci d'exhaustivité :

Vous pouvez (ab)utiliser le -m option. Extrait de la page de manuel de Python :

   -m module-name
          Searches sys.path for the named module and runs the  correspond
          ing .py file as a script.

Ce qui nous donnera :

$ 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

Mais pour des modules inexistants, il nous donnera :

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Nous pourrions utiliser grep pour correspondre à cela :

$ 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

C'est un peu bidouillé, et ce n'est pas ce qu'il faut faire. -m mais c'est la méthode méthode qui nécessite le moins de saisie si vous voulez un test rapide :-)

6voto

Mona Jalal Points 3507

J'ai écrit un exemple en Python :

import pip
import sys
from bigml.api import BigML

if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])

4voto

Bruno Bronosky Points 725

Shell (utile pour le provisionnement)

J'ai découvert que pour rendre mon provisionnement d'infrastructure** idempotent, j'ai besoin de pouvoir vérifier un paquet à partir du Shell dans un oneliner. Je me suis basé sur la réponse de @cuonglm. J'ai dû inverser le 1 y 0 parce que je produis un état de sortie plutôt que d'imprimer une chaîne de caractères.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Vous pourriez remplacer le sys.argv[1] avec le nom entre guillemets de votre paquet, mais pour mes scripts de provisionnement, j'aime la lisibilité de l'avoir à la fin.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Je réalise que chef cuisinier , Marionnette y ansible ont tous des plugins pour gérer les paquets Python, mais vous pouvez vous trouver dans une situation comme la mienne où vous utilisez une version obsolète et ne voulez pas utiliser des plugins dépréciés.

1voto

Sergiy Kolodyazhnyy Points 97292

On peut aussi utiliser pydoc modules qui peut être filtré avec grep pour trouver un module spécifique. La sortie est affichée sous forme de colonnes. Le seul inconvénient de cette approche est qu'elle inclut également les fichiers Python dans le répertoire de travail actuel. Néanmoins, je l'utilise moi-même la plupart du temps et c'est l'une des approches les plus citées sur cette question connexe : https://stackoverflow.com/q/739993/3701431

1voto

xCovelus Points 271

A partir du Shell d'Ubuntu, par défaut bash, aussi simple que

pip list | grep <package-name-Case-Matters>

Exemples

pip list | grep pywinrm

pip list | grep numpy

Et, si vous avez des doutes sur la casse (bien que je pense que tous les noms de paquets sont toujours en minuscules) :

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X