Maison >développement back-end >Tutoriel Python >Pourquoi mes importations relatives Python 3 échouent-elles et comment puis-je les corriger ?

Pourquoi mes importations relatives Python 3 échouent-elles et comment puis-je les corriger ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 05:21:18284parcourir

Why Are My Python 3 Relative Imports Failing, and How Can I Fix Them?

Importations relatives dans Python 3 : compréhension et solutions de contournement

Les importations relatives, couramment utilisées pour importer des modules dans le même répertoire, peuvent parfois conduire à des erreurs telles que ImportError ou ModuleNotFoundError. Comprendre les raisons sous-jacentes est crucial pour résoudre ces problèmes.

Comportement d'importation relatif dans Python 3

Dans Python 3, les importations relatives ne fonctionnent que si le module importe l'autre module est dans le même package. Un package est un répertoire contenant un fichier __init__.py, indiquant l'état de son package. Si le package contient des sous-répertoires avec des modules supplémentaires, les importations relatives de ces sous-répertoires vers des modules dans d'autres sous-répertoires échoueront.

Inclusion du package racine

Pour résoudre ce problème, assurez-vous que le répertoire parent des modules impliqués est un package, indiqué par la présence d'un fichier __init__.py. Si le répertoire parent n'est pas un package, l'importation relative échouera avec l'erreur "tentative d'importation relative sans package parent connu."

Erreur : "ModuleNotFoundError : Aucun module nommé 'mymodule'"

Cette erreur se produit lorsque le module en cours d'importation (mymodule dans ce cas) n'existe pas dans le chemin spécifié. Vérifiez que le module existe et qu'il est correctement nommé.

Erreur : "SystemError : Module parent '' non chargé, impossible d'effectuer une importation relative"

Cette erreur indique que le module le module parent (celui contenant l'importation relative) n'a pas été chargé. Assurez-vous que le module parent est en cours d'exécution ou d'importation avant de tenter l'importation relative.

Solutions de contournement pour les importations relatives

S'il n'est pas possible d'éviter les importations relatives, il existe des solutions de contournement :

  • Utiliser les importations absolues : Remplacer from .mymodule import myfunction par from mypackage.mymodule importe mafonction, en utilisant le chemin absolu du package racine.
  • Modifier PYTHONPATH : Ajoutez le répertoire parent du package à la variable d'environnement PYTHONPATH pour le rendre disponible à la recherche du module chemin.
  • Frob PYTHONPATH dans le code : Ajouter le répertoire parent à sys.path en utilisant des extraits de code comme celui fourni dans la réponse donnée.

Attention concernant l'exécution de scripts dans un package

Guido van Rossum, le créateur de Python considère l'exécution de scripts dans un package comme un anti-modèle et le considère comme inutile. Cependant, pour les scénarios où cela est nécessaire, les solutions de contournement ci-dessus peuvent être utilisées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn