La colonne
Les problèmes d'échec d'importation sont généralement divisés en deux types : l'un consiste à importer des modules écrits par vous-même (c'est-à-dire des fichiers avec le suffixe .py
), et l'autre consiste à importer Bibliothèque à trois. Cet article traite principalement de la deuxième situation. Si nous en avons l’occasion à l’avenir, nous aborderons en détail d’autres sujets connexes.
Pour résoudre le problème de l'échec de l'importation de la bibliothèque Python
, la clé est d'installer la bibliothèque manquante dans l'environnement en cours d'exécution (faites attention s'il s'agit d'un environnement virtuel) ou d'utiliser une alternative appropriée. Ce problème se divise en trois situations :
Lors de l'écriture du code, si nous devons utiliser une bibliothèque tierce (telle que requests
), Mais si vous n'êtes pas sûr que l'environnement d'exécution actuel l'ait installé, vous pouvez faire ceci :
try: import requestsexcept ImportError: import os os.system('pip install requests') import requests复制代码
L'effet d'écrire de cette façon est que si la bibliothèque requests
est introuvable, installez-la d'abord, puis importez-le.
Dans certains projets open source, nous pouvons également voir l'écriture suivante (en prenant json
comme exemple) :
ry: import simplejson as jsonexcept ImportError: import json复制代码
L'effet d'écrire de cette façon est que les bibliothèques tierces sont importées d'abordsimplejson
, s'il n'est pas trouvé, utilisez la bibliothèque standard intégrée json
.
L'avantage de cette façon d'écrire est qu'il n'est pas nécessaire d'importer des bibliothèques supplémentaires, mais elle présente un inconvénient, c'est-à-dire qu'elle doit garantir que les deux bibliothèques sont compatibles lors de l'utilisation d'une bibliothèque alternative. ne peut pas être trouvé dans la bibliothèque standard, alors ce n'est pas réalisable.
Si vous ne trouvez vraiment pas de bibliothèque standard compatible, vous pouvez également écrire vous-même un module (comme my_json.py
) pour obtenir ce que vous voulez, puis l'importer dans l'instruction except
.
ry: import simplejson as jsonexcept ImportError: import my_json as json复制代码
Les mots de code ne sont pas faciles à dire des bêtises. Si vous avez besoin de matériel d'apprentissage ou si vous avez des questions techniques, veuillez communiquer "Cliquez sur "
L'idée ci-dessus est destinée aux projets en cours de développement, mais elle présente plusieurs inconvénients :
1 Il n'est pas conseillé de pip install
inclure toutes les bibliothèques tierces manquantes possibles dans le code ;
2. Que dois-je faire si une bibliothèque tierce ne peut pas être remplacée par la bibliothèque standard ou ma propre bibliothèque manuscrite ?
3. Que dois-je faire si ces modifications ne sont pas autorisées pour un projet terminé ?
La question ici est donc : il y a un projet que je souhaite déployer sur une nouvelle machine. Il implique de nombreuses bibliothèques tierces, mais aucune d'entre elles n'est préinstallée sur la machine. ?
Pour un projet conforme, selon convention, il contient généralement un fichier "requirements.txt
" qui enregistre toutes les bibliothèques dépendantes du projet et leurs numéros de version requis. Celui-ci est généré à l'aide de la commande pip freeze > requirements.txt
avant la sortie du projet.
Utilisez la commande pip install -r requirements.txt
(exécutez-la dans le répertoire où se trouve le fichier, ou écrivez le chemin de l'intégralité du fichier dans la commande) pour installer automatiquement toutes les bibliothèques dépendantes.
Mais que se passe-t-il si le projet n'est pas conforme ou, pour une autre raison malheureuse, nous ne disposons pas d'une telle documentation ?
Une méthode stupide consiste à exécuter le projet, à attendre qu'il génère une erreur, et si une bibliothèque d'importation échoue, à l'installer manuellement, puis à réexécuter le projet, et si la bibliothèque d'importation échoue, à l'installer, et ainsi de suite. sur... …
Existe-t-il une meilleure façon d'importer automatiquement les bibliothèques manquantes ?
Existe-t-il un moyen d'importer automatiquement les bibliothèques requises sans modifier le code d'origine et sans nécessiter le fichier "requirements.txt
" ?
Bien sûr ! Jetons d'abord un coup d'œil à l'effet :
Prenons tornado
comme exemple. On voit dès la première étape que nous n'avons pas installé tornado
. Après la deuxième étape, lors de l'importation à nouveau de tornado
, le programme téléchargera et installera automatiquement tornado
pour nous, donc aucune erreur ne sera signalée.
autoinstall
est notre module manuscrit, le code est le suivant :
# 以下代码在 python 3.6.1 版本验证通过import sysimport osfrom importlib import import_moduleclass AutoInstall(): _loaded = set() @classmethod def find_spec(cls, name, path, target=None): if path is None and name not in cls._loaded: cls._loaded.add(name) print("Installing", name) try: result = os.system('pip install {}'.format(name)) if result == 0: return import_module(name) except Exception as e: print("Failed", e) return Nonesys.meta_path.append(AutoInstall)复制代码
sys.meta_path
est utilisé dans ce code, imprimons-le d'abord pour voir ce que c'est ? Le mécanisme
Python 3
de import
se déroule à peu près dans l'ordre suivant pendant le processus de recherche :
Regardez dans sys.modules
, qui met en cache tous les modules importés
Regardez dans sys.meta_path
, qui prend en charge les chargeurs personnalisés
Recherchez dans sys.path
, qui enregistre les noms de répertoires de certaines bibliothèques
S'il n'est pas trouvé, lancez une ImportError
exception
Il convient de noter que sys.meta_path
est différent dans les différentes versions Python
Par exemple, il est très différent entre Python 2
et Python 3
dans les versions plus récentes de Python 3
; (3.4+), les chargeurs personnalisés doivent implémenter la méthode find_spec
, alors que les versions antérieures utilisaient find_module
.
Le code ci-dessus est un chargeur de bibliothèque de classes personnalisé AutoInstall
, qui peut importer automatiquement des bibliothèques tierces. Il convient de noter que cette méthode "piratera" toutes les bibliothèques nouvellement importées et détruira la méthode d'importation d'origine, donc des problèmes étranges peuvent également survenir, alors faites attention.
sys.meta_path
est une application de la sonde Python
. Les sondes, ou import hook
, sont des mécanismes Python
qui n'attirent presque aucune attention, mais ils peuvent faire beaucoup de choses, comme charger des bibliothèques sur le réseau, modifier des modules lors de leur importation, installer automatiquement des bibliothèques manquantes et télécharger des informations d'audit. , chargement paresseux, et plus encore.
En raison du manque de place, nous ne développerons pas davantage. Enfin, pour résumer :
Vous pouvez utiliser la méthode try…except
pour implémenter une simple importation de bibliothèque tierce ou le remplacement de
tous connus bibliothèques dépendantes manquantes (telles que requirements.txt
), vous pouvez installer manuellement
Utilisez sys.meta_path
pour importer automatiquement toute bibliothèque manquante
Recommandations d'apprentissage gratuites associées : Tutoriel Python(vidéo)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!