Vérifier si le paquet Python est installé
-
20-08-2019 - |
Question
Quel est le bon moyen de vérifier si un paquet est installé 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é et sinon, je l'installerai.
Mes idées pour réussir le test
- recherchez un répertoire dans le chemin d'installation typique
- essayez d'importer le paquet et si une exception est levée, installez le paquet
La solution
Si vous parlez d'un script python, procédez comme suit:
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
Autres conseils
Réponse mise à jour
Une meilleure façon de procéder est la suivante:
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 procéder est la suivante:
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 de pkg_resources.Distribution
objets. Voir l'exemple suivant:
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 <=> est installé:
if 'requests' in flat_installed_packages:
# Do something
A partir de Python 3.3, vous pouvez utiliser le find_spec (). méthode
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")
Si vous souhaitez avoir la vérification du terminal, vous pouvez exécuter
pip3 show package_name
et si rien n'est renvoyé, le package 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
En tant qu'extension 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: 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
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.
J'aimerais ajouter quelques réflexions / conclusions à ce sujet. J'écris un script qui vérifie toutes les exigences pour un programme personnalisé. Il y a aussi beaucoup de 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 d’accès, mais il n’est peut-être pas nécessaire d’utiliser beaucoup de mémoire pour un simple test / contrôle.
J'ai aussi constaté que
import pip
installed_packages = pip.get_installed_distributions()
installed_packages
aura uniquement les packages qui ont été installés avec pip .
Sur mon système, pip freeze
retourne sur 40
les modules python, alors que 1
n’a que nmap
, 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 j'estime qu'il est judicieux de séparer la fonction de test de celle qui effectue la installez-le pourrait ê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 le module sous le nom <=> également. Je dois utiliser <=> à la place (facile à vivre), mais dans ce cas, le module ne sera pas chargé dans la mémoire. .
Si vous voulez que votre script installe les paquetages manquants et continue, vous pouvez faire quelque chose comme ça (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))
Un moyen rapide consiste à utiliser l'outil de ligne de commande python .
Tapez simplement import <your module name>
Vous voyez une erreur si le 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
$
Aller option n ° 2. Si ImportError
est lancé, le paquet n'est pas installé (ou pas dans sys.path
).