Réponses:
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
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-pip
comme suggéré par Zack Titan dans le commentaire ci - dessous , Pour installer , numpy
vous 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 pip
méthode en tant que superutilisateur (c'est-à-dire, en tant que root
ou en utilisant sudo
). Dans certains cas, cela peut rendre votre système inutilisable en cassant python.
Comment installer des packages en utilisant pip
l'environnement virtuel local.
vpython
vous devez l'installer en tant quesudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
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 --user
option ou virtualenv pour installer vous-même les packages Python.
Si nous ne souhaitons pas importer de manière indésirable un module en question (ce qui se produirait dans une try
instruction), nous pouvons nous en servir sys.modules
pour 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 True
ce test, tous les autres modules (même installés) génèrentFalse.
Une autre alternative à try
une import
instruction 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.modules
dictionnaire en les important une fois.
sys.modules
ne 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/except
et piéger le ImportError
, comme plusieurs autres l'ont déjà suggéré.
sys.modules
n’est absolument pas pertinent et je pense que toute mention à ce sujet est trompeuse. Mais peut-être que c'est juste moi.
sys.modules
n'est pas une aide ici.
Une autre façon est le pkgutil
module. Fonctionne à la fois avec Python 2 et 3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
Vous devez remplacer module
par le nom de votre module, exemple:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
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 tuple
dont 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)
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-pip
s’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>
pip show <module-name>
montrera si un paquet est installé, par exemple pip show numpy
.
Vous pouvez mettre le code à l'intérieur try
, except
bloquer.
$ 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
Pour fournir une autre réponse, par souci d'achèvement:
Vous pouvez (ab) utiliser l' -m
option. 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 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 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 :-)
grep -q
rend la redirection vers null inutile.
/dev/null
fil des ans: - /
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'])
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 1
et 0
parce 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.
On peut également utiliser pydoc modules
, avec lequel on peut filtrer, grep
un 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
À 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
Au moment de la rédaction, cela pip show ...
semble être le moyen le plus simple:
https://pip.pypa.io/fr/stable/reference/pip_show/
Mais il est silencieux (c’est-à-dire ne renvoie rien) lorsque le package n’est pas installé.