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'
19
demandé sur Lii 2010-12-24 20:30:44

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.

11
répondu user225312 2014-04-03 19:31:20
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à.

13
répondu ewil 2016-06-22 07:25:09

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'])
9
répondu Frangossauro 2017-02-15 22:15:20

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.

1
répondu Noufal Ibrahim 2010-12-24 17:41:44

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.

0
répondu Assaf Lavie 2010-12-24 17:44:33