
Envoyé par
dedalios
une question pourquoi ceci étant le programme fonctionne?
Je pensais que vos import ne fonctionnait pas.
Si votre programme se trouve à la racine du projet alors PyDev l'inclut d'office il me semble et/ou le répertoire du fichier en cours d’exécution.
Mais par-contre essayez depuis un sous-répertoire de votre projet de faire un import relatif :
Voici un cas concret :
Avec l'arborescence suivante :
1 2 3 4 5 6 7 8
| project\
main.py
sub_folder\
__init__.py
lib.py
sub_folder_lvl2\
__init__.py
lib2.py |
main.py :
lib.py :
lib2.py :
Jusque là tout fonctionne.
Maintenant on veut vouloir importer lib2 depuis lib.py :
Ceci ne devrait pas marcher en exécutant main :
lib.py :
1 2 3
| from sub_folder_lvl2 import lib2
element = lib2.element |
1 2 3 4 5 6
| Traceback (most recent call last):
File "project\main.py", line 1, in <module>
from sub_folder import lib
File "project\sub_folder\lib.py", line 1, in <module>
from sub_folder_lvl2 import lib2
ImportError: No module named 'sub_folder_lvl2' |
mais fonctionnera en l'exécutant seul puisque le chemin du fichier en cours a été rajouté, là où se trouve le répertoire sub_folder_lvl2.
Ceci devrait marcher en exécutant main :
lib.py :
1 2 3
| from sub_folder.sub_folder_lvl2 import lib2
element = lib2.element |
Mais ne fonctionnera pas en exécutant directement lib.py:
1 2 3 4
| Traceback (most recent call last):
File "project\sub_folder\lib.py", line 1, in <module>
from sub_folder.sub_folder_lvl2 import lib2
ImportError: No module named 'sub_folder' |
Et ceci marchera dans les deux cas, seul et depuis le main :
1 2 3 4 5 6
| import sys, os
sys.path.insert(1, os.path.dirname(__file__))
from sub_folder_lvl2 import lib2
element = lib2.element |
Et si on place l'ajout du chemin dans __init__.py cela va permettre à tous les autres fichiers du répertoire d'en profiter.
Et du coup on peut même importer depuis main directement les sous-répertoires :
main.py :
from sub_folder_lvl2 import lib2
Note importante : Il faut faire gaffe aux conflits pour les mêmes noms et être sûr de vouloir placer un sous-répertoire au même niveau.
Si c'est juste pour du test alors il vaut mieux placer le rajout du répertoire sous la condition __name__ == '__main__' pour ne pas modifier l'arborescence lorsque le fichier est importé.
Ci-joint l'exemple finalisé.
Partager