Lors de l'exécution depuis le point d'entrée de l'application elle-même, même s'il n'y a pas de problème d'exécution Lorsque j'ai démarré chaque fichier de module comme point d'entrée, je suis parfois tombé sur l'instruction d'importation, alors j'ai étudié la solution.
--6 / 12: Correction car sauf dans try ~ except que l'instruction était catch.
À titre d'exemple, considérez la structure de répertoires / fichiers suivante.
main.py ...Fichier d'exécution en tant qu'application
|
|--[src] ...Répertoire de stockage des modules
|
|-- module1.py ... main.Module appelé depuis py
|-- module2.py ... module1.Module appelé depuis py
Si le point d'entrée en tant qu'application est main.py, seul le répertoire contenant main.py sera reconnu comme chemin python. Par conséquent, tous les fichiers qui composent cette application doivent être importés à partir du répertoire où se trouve main.py. En d'autres termes, si vous souhaitez utiliser module1.py vers module2.py dans la structure de répertoires ci-dessus,
/src/module1.py
# -*- coding: utf-8 -*-
import module2 # ImportError!
Alors non
/src/module1.py
# -*- coding: utf-8 -*-
import src.module2 # OK
Doit être.
Cette description convient parfaitement, mais des problèmes surviennent lors de l'écriture du code de test dans module1.py.
Le code de test ici est censé vérifier le fonctionnement des classes et des fonctions dans module1.py. N'est-ce pas assez courant d'écrire un code simple qui appelle une fonction dans le fichier et d'appuyer sur la touche F5 pour voir le comportement du code que vous avez écrit sur place?
Cependant, si vous écrivez ʻimport src.module2, lorsque vous démarrez le programme avec module1.py comme point d'entrée, la partie
srcne peut pas être reconnue et une erreur d'importation se produira. Cela est dû au fait que le répertoire d'exécution lors du démarrage de module1.py passe au répertoire src. Il n'y a pas de répertoire appelé
src` dans le répertoire src.
Dans cet article, je vais vous montrer trois idées qui résolvent ce problème et vous permettent de lancer le programme à partir de main.py ou module1.py. À propos, tous ont des inconvénients et ce n'est pas OK si vous faites cela. Nous recherchons un moyen plus intelligent, alors veuillez commenter
--Comment faire sys.path.append () dans le fichier du module -Comment sys.path.append () avec \ _ \ _ init \ _ \ _.py --Comment attraper ImportError et branch
C'est une solution en écrivant sys.path.append ()
dans module1.py.
Je pense que c'est une méthode assez courante.
/src/module1.py
# -*- coding: utf-8 -*-
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '.'))
import module2
Il s'agit d'ajouter le répertoire contenant le fichier module1.py au chemin python.
Faire cela ajoutera le répertoire src au chemin python et l'erreur ne se produira pas même si l'instruction d'importation n'a pas src
.
En d'autres termes, il vous suffit d'importer module2.py avec ʻimport module2`.
Cependant, cette méthode pose le problème que s'il existe un grand nombre de fichiers de module, la description ci-dessus pour chaque fichier est requise.
De plus, sys.path.append ()
est reflété dans tous les fichiers utilisant module1.py, qui pollue l'espace de noms.
(Vous pourrez créer ʻimport module 2` dans main.py.)
C'est une méthode pour placer \ _ \ _ init \ _ \ _. Py directement sous le répertoire src et y effectuer sys.path.append ()
.
Dans ce cas, la structure du répertoire ressemble à ceci:
main.py ...Fichier d'exécution en tant qu'application
|
|--[src] ...Répertoire de stockage des modules
|
|-- __init__.py ... sys.path.append()Fichier à exécuter
|-- module1.py ... main.Module appelé depuis py
|-- module2.py ... module1.Module appelé depuis py
En outre, le contenu de \ _ \ _ init \ _ \ _. Py est le suivant.
/src/__init__.py
# -*- coding: utf-8 -*-
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '.'))
Ce que cela fait, c'est que lorsque vous faites ʻimport src.module1 dans main.py, \ _ \ _ init \ _ \ _. Py est également importé implicitement. Plus précisément, lors de l'exécution de ʻimport src.module1
depuis main.py, cela fonctionne de sorte que \ _ \ _ init \ _ \ _. Py soit importé en premier, puis module1.py est importé. Je vais.
pour cette raison,
sys.path.append ()
ci-dessus est exécuté et le répertoire src est ajouté au chemin python.Ce sera l'opération.
De cette façon, vous pouvez réduire la quantité de code car chaque module du répertoire src n'a pas besoin de sys.path.append ()
.
Cependant, tant que vous utilisez sys.path.append ()
, le problème de la pollution des espaces de noms demeure.
C'est une méthode pour intercepter ImportError et changer dynamiquement la destination d'importation sans utiliser sys.path.append ()
.
Plus précisément, le code est le suivant.
/src/module1.py
# -*- coding: utf-8 -*-
try:
import src.module2 # main.Si vous partez de py, cela sera exécuté
except ImportError:
import module2 # module1.Si vous partez de py, cela sera exécuté
Si ʻimport src.module2 échoue, ʻimport module2
est exécuté à la place.
Normalement, l'application s'exécute à partir de main.py, vous pouvez donc voir le répertoire src à partir du répertoire d'exécution.
Par conséquent, au démarrage de main.py, le contenu du bloc try sera exécuté sans aucun problème.
D'un autre côté, si vous démarrez module1.py comme point d'entrée, vous obtiendrez une ImportError car vous ne pouvez pas voir le répertoire src. Par conséquent, interceptez ImportError dans le bloc except et modifiez la description de la destination d'importation afin qu'elle puisse être importée avec succès.
Cette technique n'utilise pas sys.path.append ()
donc elle ne pollue pas l'espace de noms.
Cependant, le problème d'avoir à ajouter la description ci-dessus à chaque fichier de module demeure.
Dans cet article, je vous ai montré trois façons de lancer un programme à partir de main.py ou module1.py.
--Comment faire sys.path.append () dans le fichier du module -Comment sys.path.append () avec \ _ \ _ init \ _ \ _.py --Comment attraper ImportError et branch
Cependant, il y a des inconvénients à chaque méthode, je me demande donc s'il est nécessaire de les utiliser correctement en fonction de l'environnement.
Recommended Posts