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

89

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

  • Comment vais-je l'installer s'il n'est pas installé?
  • Comment saurai-je s'il est déjà installé?
TechJhola
la source

Réponses:

73

Comment savoir si un module python est installé ou non dans le système: Vous pouvez faire un test très facile en terminal,

$ python -c "import math"
$ echo $?
0                                # math module exists in system

$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1                                # numpy module does not exist in system

Comment vais-je l'installer s'il n'est pas installé

Vous pouvez installer un module spécifique en téléchargeant les packages correspondants depuis le référentiel. Vous pouvez par exemple installer enscipy tant que,

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Alternativement , vous pouvez également installer un module python en utilisant python-pipcomme suggéré par Zack Titan dans le commentaire ci - dessous , Pour installer , numpyvous pouvez utiliser

pip install numpy

Avertissement: Il est fortement recommandé d'installer python-modules en utilisant uniquement le référentiel officiel Ubuntu et de ne pas utiliser la pipméthode en tant que superutilisateur (c'est-à-dire, en tant que rootou en utilisant sudo). Dans certains cas, cela peut rendre votre système inutilisable en cassant python.

Comment installer des packages en utilisant pipl'environnement virtuel local.

souravc
la source
Comme dans votre réponse, le module mathématique existe et pour numby, la trace ne s'affiche pas et pour echo $? la sortie était 0, cela signifie-t-il que numpy est également présent dans mon système?
TechJhola
1
oui, il est là dans votre système.
Souravc
Si vous n'avez pas le module numpy, comment allez-vous l'importer? Lorsque nous effectuons le codage, nous appelons l'instruction import depuis numpy import *, installera-t-il le module? Sinon, comment allons-nous installer un nouveau module?
TechJhola
1
Ce sera une question septique comment installer un module. Besoin de différents packages pour différents modules. Par exemple, pour l'installer, vpythonvous devez l'installer en tant quesudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc
1
ne pas utiliser sudo pip; cela peut casser le système python. Utilisez apt-get pour installer des paquets pour le système python. Vous pouvez utiliser pip --useroption ou virtualenv pour installer vous-même les packages Python.
jfs
21

Si nous ne souhaitons pas importer de manière indésirable un module en question (ce qui se produirait dans une tryinstruction), nous pouvons nous en servir sys.modulespour tester les modules installés et importés auparavant.

Dans le problème du shell Python:

>>> import sys

Puis testez les modules installés:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Notez que seuls les modules importés avant donnent Truece test, tous les autres modules (même installés) génèrentFalse.

Une autre alternative à tryune importinstruction de la console python est l’appel de la help()fonction intégrée . Cela ne donnera pas de documentation pour les modules non installés, par exemple

>>> help('scipy')
no Python documentation found for 'scipy'

La sortie de très longs documents d’aide des modules installés peut être interrompue Q.

Maintenant, pour installer les modules manquants, il est recommandé d’utiliser la gestion des paquets Ubuntu (et non la méthode du pip Python) car nous avons besoin d’un accès root et également d’éviter de perturber notre système, qui dépend fortement de Python. Pour le module en question, par exemple:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Après l'installation, nous pouvons ensuite les ajouter au sys.modulesdictionnaire en les important une fois.

Takkat
la source
1
Je pense que c'est la réponse la plus
pythonique
3
La première partie est incorrecte: elle sys.modulesne contient que des modules déjà importés . Ce n'est donc pas un moyen fiable de vérifier si un module a été installé. Le test le plus fiable consiste à utiliser un try/exceptet piéger le ImportError, comme plusieurs autres l'ont déjà suggéré.
ekhumoro
@ekhumoro - merci, je vais modifier ma réponse pour que cela soit plus clair.
Takkat
4
Cela ne semble toujours pas suffisamment clair. Étant donné que la question est de savoir comment savoir si un module est installé (et non importé ), sys.modulesn’est absolument pas pertinent et je pense que toute mention à ce sujet est trompeuse. Mais peut-être que c'est juste moi.
David Z
1
sys.modulesn'est pas une aide ici.
chat
19

Une autre façon est le pkgutilmodule. Fonctionne à la fois avec Python 2 et 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Vous devez remplacer modulepar le nom de votre module, exemple:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
cuonglm
la source
2
Je vous ai vu annuler certaines de mes modifications; print()fonctionnera également très bien dans Python 2; Elle est traitée comme une syntaxe de groupe avec parens et n'a aucun effet secondaire. Ce n'est que lorsque vous souhaitez ajouter plusieurs éléments (car dans print('a', 'b')ce cas, ils seront traités comme des éléments tupledont vous avez besoin from __future__ import print_function, mais ce n'est pas applicable dans ce cas, vous pouvez simplement écrire du code compatible en aval en ajoutant les parens (j'ai testé mes modifications en Python 2 et 3)
Martin Tournoij
@Carpetsmoker: Merci de l'avoir signalé. Je reviens à l'ancienne version.
Cuonglm
C'est une excellente réponse. J'ai ajouté une réponse dérivée qui renvoie un code de sortie / statut (pour le contrôle de flux de script shell) et prend le nom du module comme argument de ligne de commande. askubuntu.com/a/891384/146273
Bruno Bronosky
Ça a marché! - Il suffit de changer pour exitqu'il puisse être utilisé dans un contexte de shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

Je sais que l’opérateur avait initialement demandé une solution après avoir démarré Python, mais j’utilise en dehors de Python pip. Sur Ubuntu:, sudo apt-get install python-pips’il n’est pas déjà installé.

Ensuite, pour voir quels modules tiers sont disponibles, lancez simplement:

pip freeze

Ou même

pip list

Et tous les deux vous montreront tous les modules installés et leurs versions.

Si le module que vous recherchez n'est pas installé, vous pouvez généralement l'installer facilement avec pip:

pip install <module-name>

Si vous n'êtes pas sûr de l'existence d'un module ou de son nom PyPI, utilisez pip search:

pip search <keyword>
OozeMeister
la source
1
En outre, pip show <module-name>montrera si un paquet est installé, par exemple pip show numpy.
Herpes Free Engineer
10

Vous pouvez mettre le code à l'intérieur try, exceptbloquer.

$ python3 -c "\
try:
    import cow  
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

There was no such module installed

$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
Avinash Raj
la source
6

Pour fournir une autre réponse, par souci d'achèvement:

Vous pouvez (ab) utiliser l' -moption. 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 les modules inexistants, cela nous donnera:

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

Nous pourrions utiliser greppour 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 pas ce à quoi il -métait destiné; mais c'est la méthode qui nécessite le moins de frappe si vous voulez un test rapide :-)

Martin Tournoij
la source
4
grep -qrend la redirection vers null inutile.
muru
3
@muru Yikes! J'ai tapé beaucoup de redirections inutiles au /dev/nullfil des ans: - /
Martin Tournoij
4

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'])
Mona Jalal
la source
3

Shell oneliner check (utile pour le provisionnement)

J'ai constaté que pour rendre mon infrastructure d'approvisionnement ** idempotente, je devais être en mesure de rechercher un package dans le shell dans un doubleur. J'ai construit sur la réponse de @ cuonglm. J'ai dû inverser le 1et 0parce que je produis un état de sortie plutôt que d'imprimer une chaîne.

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

Vous pouvez remplacer le sys.argv[1]par le nom entre guillemets unique de votre paquet, mais pour mes scripts de provisioning, 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 me rends compte que chef , marionnette et ansible ont tous des plugins pour gérer les paquets python, mais vous pouvez vous retrouver dans une situation comme moi, où vous utilisez une version obsolète et ne souhaitez pas utiliser de plugins obsolètes.

Bruno Bronosky
la source
1

On peut également utiliser pydoc modules, avec lequel on peut filtrer, grepun module spécifique. La sortie est affichée sous forme de colonne. Le seul inconvénient de cette approche est qu’elle inclura é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: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
la source
0

À partir du shell 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 le cas (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
xCovelus
la source