Vérifier si le module existe, sinon l'installer
je veux vérifier si un module existe, si ce n'est pas que je veux l'installer.
Comment dois-je faire?
Jusqu'à présent j'ai ce code qui imprime correctement f
si le module n'existe pas.
try:
import keyring
except ImportError:
print 'f'
5 réponses
Voici comment faire, et si je me trompe, corrigez-moi. Cependant, Noufal semble le confirmer dans une autre réponse à cette question, donc je suppose que c'est bon.
en écrivant le setup.py
script pour certains scripts que j'ai écrits, je dépendais du gestionnaire de paquets de ma distribution pour installer la bibliothèque requise pour moi.
Donc, dans mon setup.py
le fichier, j'ai fait ceci:
package = 'package_name'
try:
return __import__(package)
except ImportError:
return None
si package_name
a été installé, fine, continuer. Sinon, installez-le via le gestionnaire de paquets que j'ai appelé en utilisant subprocess
.
import pip
def import_or_install(package):
try:
__import__(package)
except ImportError:
pip.main(['install', package])
ce code tente simplement d'importer un paquet, où paquet est de type str, et s'il est incapable de le faire, appelle pip et tente de l'installer à partir de là.
cette approche de l'import dynamique fonctionne très bien dans les cas où vous voulez juste imprimer un message si le module n'est pas installé. Installation automatique d'un module NE DEVRAIT PAS comme la délivrance de pip via subprocess
. C'est pourquoi nous avons mis en place des outils (ou distribuons).
nous avons quelques grands tutoriels sur l'empaquetage, et la tâche de détection/installation des dépendances est aussi simple que de fournir install_requires=[ 'FancyDependency', 'otherFancy>=1.0' ]
. C'est tout!
Mais, si vous avez vraiment besoin pour faire à la main, vous pouvez utiliser setuptools
pour vous aider.
from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()
# Printing all installed modules
print tuple(working_set)
# Detecting if module is installed
try:
dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
pass
# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['django>=1.2'])
Vous pouvez lancer pip install %s"%keyring
dans la partie sauf pour faire ceci mais je ne le recommande pas. La bonne façon est d'empaqueter votre application en utilisant distutils de sorte que lorsqu'il est installé, les dépendances seront activées.
tous les modules ne peuvent pas être installés aussi facilement. Tous n'ont pas un support facile à installer, certains ne peuvent être installés qu'en les construisant.. d'autres nécessitent des pré-requis non-python, comme gcc, ce qui rend les choses encore plus compliquées (et l'oublier de bien fonctionner sous Windows).
donc je dirais que vous pourriez probablement le faire fonctionner pour certains modules prédéterminés, mais il n'y a aucune chance que ce soit quelque chose de générique qui fonctionne pour n'importe quel module.