Quel est un bon moyen de vérifier si un package est installé dans un script Python? Je sais que c'est facile avec l'interpréteur, mais je dois le faire dans un script.
Je suppose que je pourrais vérifier s'il y a un répertoire sur le système qui a été créé lors de l'installation, mais j'ai l'impression qu'il y a une meilleure façon. J'essaie de m'assurer que le package Skype4Py est installé, et sinon je l'installerai.
Mes idées pour effectuer le contrôle
- rechercher un répertoire dans le chemin d'installation typique
- essayez d'importer le package et si une exception est lancée, installez le package
python
package
skype
python-import
Kevin
la source
la source
Réponses:
Si vous voulez dire un script python, faites quelque chose comme ceci:
Python 3.3+ utilise sys.modules et find_spec :
Python 3:
Python 2:
la source
Réponse mise à jour
Une meilleure façon de procéder est:
Le résultat:
Vérifiez si
requests
est installé:Pourquoi de cette façon? Parfois, vous avez des collisions de noms d'applications. L'importation à partir de l'espace de noms de l'application ne vous donne pas une image complète de ce qui est installé sur le système.
Notez que la solution proposée fonctionne:
pip install http://some.site/package-name.zip
ou tout autre type d'archive).python setup.py install
.sudo apt install python-requests
.Cas où cela pourrait ne pas fonctionner:
python setup.py develop
.pip install -e /path/to/package/source/
.Ancienne réponse
Une meilleure façon de procéder est:
Pour pip> = 10.x utilisez:
Pourquoi de cette façon? Parfois, vous avez des collisions de noms d'applications. L'importation à partir de l'espace de noms de l'application 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'
pkg_resources.Distribution
objets. Voir l'exemple suivant:Faites-en une liste:
Vérifiez si
requests
est installé:la source
import json
fonctionne effectivement). La méthode de ice.nicer fonctionne dans ce cas.if "u'requests'" in installed_packages:
de la réponse mise à jour pour travailler pour moi. La sortie deprint()
produit ceci sur mon python macOS:[..., u'pytz', u'requests', ...]
if "requests'"
(notez le guillemet simple à la fin). n'a aucun sens.pip
. Par exemple, vous pouvez créer et installer un package à partir des sources. Cette réponse ne les trouvera pas. La réponse de @ ice.nicerfind_spec()
est juste.Depuis Python 3.3, vous pouvez utiliser la méthode find_spec ()
la source
importlib.util.find_spec('google-cloud-logging')
ne trouve rien tant qu'ilimportlib.util.find_spec('google.cloud.logging')
est trouvé. Le nom officiel et le nom que pip montre sont avec des tirets, pas des points. Peut être déroutant, donc à utiliser avec prudence.Si vous souhaitez avoir le chèque du terminal, vous pouvez exécuter
et si rien n'est retourné, le package n'est pas installé.
Si vous souhaitez automatiser cette vérification, afin que par exemple vous puissiez l'installer en cas d'absence, vous pouvez avoir ce qui suit dans votre script bash:
la source
if
if pip3 show package_name 1>/dev/null; then ...
En prolongement de cette réponse :
Pour Python 2. *,
pip show <package_name>
effectuera la même tâche.Par exemple
pip show numpy
, retournera ce qui suit ou similaire:la source
Vous pouvez utiliser le module pkg_resources de setuptools. Par exemple:
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.
la source
Ouvrez votre type d'invite de commande
la source
J'aimerais ajouter quelques réflexions / découvertes à ce sujet. J'écris un script qui vérifie toutes les exigences d'un programme personnalisé. Il existe également de nombreuses vérifications avec les modules python.
Il y a un petit problème avec le
Solution. Dans mon cas, l'un des modules python est appelé
python-nmap
, mais vous l'importez avecimport nmap
et comme vous voyez que les noms ne correspondent pas. Par conséquent, le test avec la solution ci-dessus renvoie un résultat Faux, et il importe également le module lors de la frappe, mais peut-être pas besoin d'utiliser beaucoup de mémoire pour un simple test / vérification.J'ai aussi trouvé que
installed_packages
aura seulement les paquets a été installé avec pip . Sur mon système,pip freeze
retourne sur les40
modules python, tandis queinstalled_packages
n'a que1
celui que j'ai installé manuellement (python-nmap).Une autre solution ci-dessous dont je sais qu'elle n'est peut-être pas 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 pourrait être utile pour certains.
La solution qui a fonctionné pour moi. Il est basé sur cette réponse Comment vérifier si un module python existe sans l'importer
REMARQUE: cette solution ne trouve pas non plus le module par son nom
python-nmap
, je dois l'utiliser à lanmap
place (facile à vivre) mais dans ce cas, le module ne sera pas chargé dans la mémoire du tout.la source
Si vous souhaitez que votre script installe les packages manquants et continue, vous pouvez faire quelque chose comme ceci (sur l'exemple du module 'krbV' dans le package 'python-krbV'):
la source
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.la source
Hmmm ... le plus proche que j'ai vu d'une réponse pratique était d'utiliser la ligne de commande pour essayer l'importation. Mais je préfère même éviter cela.
Que diriez-vous de «gel de pip grep pkgname '? Je l'ai essayé et ça marche bien. Il vous montre également la version dont il dispose et s'il est installé sous contrôle de version (installation) ou modifiable (développement).
la source
class myError (exception): passer #ou faire quelque chose essayer: importer mon module sauf ImportError comme e: lever myError ("une erreur s'est produite")
la source
Dans le type de terminal
Exemple
la source
Je voudrais commenter la réponse @ ice.nicer mais je ne peux pas, donc ... Mes observations sont que les paquets avec des tirets sont enregistrés avec des traits de soulignement, pas seulement avec des points comme indiqué par @dwich comment
Par exemple, vous le faites
pip3 install sphinx-rtd-theme
, mais:importlib.util.find_spec(sphinx_rtd_theme)
renvoie un objetimportlib.util.find_spec(sphinx-rtd-theme)
renvoie Aucunimportlib.util.find_spec(sphinx.rtd.theme)
lève ModuleNotFoundErrorDe plus, certains noms sont totalement modifiés. Par exemple, vous le faites
pip3 install pyyaml
mais il est enregistré simplement sousyaml
J'utilise python3.8
la source
la source
Allez l'option n ° 2. Si
ImportError
est levé, le package n'est pas installé (ou pas danssys.path
).la source