Pages : 1
#1 Le 07/08/2020, à 17:59
- toitoinebzh
Python - import relatif
Bonjour,
Je développe depuis quelques temps des applications python à usage perso et j'en ai une qui commence à prendre de l'ampleur,
Ayant un paquet de fichiers py, j'ai voulu faire du rangement et classer tout ça dans plusieurs dossiers.
Je rencontre maintenant un soucis qui est l'import de mes modules perso.
J'ai eu le réflexe de faire un import en relatif en utilisant des . et à ma surprise j'ai un message d'erreur. Voilà un exemple qui reproduit l'erreur
Je voudrais lancer une fonction contenu dans dir_b depuis un fichier file_a dans un autre dossier
antoine@Talos:~/Bureau$ tree test
test
├── dir_a
│ ├── file_a.py
│ └── __init__.py
├── dir_b
│ ├── file_b.py
│ └── __init__.py
└── __init__.py
2 directories, 5 files
antoine@Talos:~/Bureau$ cat test/dir_a/file_a.py
from ..dir_b import printb
printb()
antoine@Talos:~/Bureau$ cat test/dir_b/file_b.py
def printb():
print("b")
antoine@Talos:~/Bureau$ python3 test/dir_b/file_b.py
antoine@Talos:~/Bureau$ python3 test/dir_a/file_a.py
Traceback (most recent call last):
File "test/dir_a/file_a.py", line 1, in <module>
from ..dir_b import printb
ImportError: attempted relative import with no known parent package
antoine@Talos:~/Bureau$ cd test/dir_a/
antoine@Talos:~/Bureau/test/dir_a$ python3 file_a.py
Traceback (most recent call last):
File "file_a.py", line 1, in <module>
from ..dir_b import printb
ImportError: attempted relative import with no known parent package
je ne comprends pas cette erreur.
comment fonctionne l'import relatif ?
Hors ligne
#2 Le 07/08/2020, à 19:33
- nany
Re : Python - import relatif
Hors ligne
#3 Le 07/08/2020, à 20:46
- toitoinebzh
Re : Python - import relatif
from ..dir_b.file_b import printb
?
si je comprends la doc, c'est ce qu'il faut faire
dans la pratique
antoine@Talos:~/Bureau/test/dir_a$ cat file_a.py
from ..dir_b.file_b import printb
printb()
antoine@Talos:~/Bureau/test/dir_a$ python3 file_a.py
Traceback (most recent call last):
File "file_a.py", line 1, in <module>
from ..dir_b.file_b import printb
ImportError: attempted relative import with no known parent package
antoine@Talos:~/Bureau/test/dir_a$
bon je vais relire cette doc ...
Hors ligne
#4 Le 07/08/2020, à 21:57
- nany
Re : Python - import relatif
Bon, ça ne paraît pas simple cette gestion d’arborescence mais la solution semblerait se trouver ici.
Hors ligne
#5 Le 08/08/2020, à 07:09
- toitoinebzh
Re : Python - import relatif
merci pour ton aide,
ça avance mas ce n'est pas encore ça
antoine@Talos:~/Bureau$ python3 -m test.dir_a.file_a
b
antoine@Talos:~/Bureau$ cd test/dir_a/
antoine@Talos:~/Bureau/test/dir_a$ python3 -m file_a
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/home/antoine/Bureau/test/dir_a/file_a.py", line 1, in <module>
from ..dir_b.file_b import printb
ImportError: attempted relative import with no known parent package
antoine@Talos:~/Bureau/test/dir_a$
en utilisant l'option -m et en se placant dans un répertoire parent qui contient les deux dossiers ça se lance
par contre ça ne se lance pas dans le répertoire du fichier, ce n'est pas très pratique, il y a peut être une astuce dans la config de spyder pour faire automatiquement ce boulot mais je ne vois rien de parlant dans la config
Hors ligne
#6 Le 08/08/2020, à 08:38
- nany
Re : Python - import relatif
en utilisant l'option -m et en se placant dans un répertoire parent qui contient les deux dossiers ça se lance
De ce que j’ai compris ça ne peut fonctionner que comme ça sinon il y aura toujours le problème de paquet parent inconnu.
Hors ligne
#7 Le 08/08/2020, à 13:10
- toitoinebzh
Re : Python - import relatif
bon je continue d'avancer, en utilisant PYTHONPATH, j'arrive à débloquer la situation
maintenant, il faut que je trouve comment configurer spyder, dans le terminal ça fonctionne,
antoine@Talos:~/Bureau/test$ cat dir_a/file_a.py
from dir_b.file_b import printb
printb()
antoine@Talos:~/Bureau/test$ cat dir_b/file_b.py
def printb():
print("b")
antoine@Talos:~/Bureau/test$ python3 dir_a/file_a.py
Traceback (most recent call last):
File "dir_a/file_a.py", line 1, in <module>
from dir_b.file_b import printb
ModuleNotFoundError: No module named 'dir_b'
antoine@Talos:~/Bureau/test$ export PYTHONPATH=$PYTHONPATH:/home/antoine/Bureau/test/
antoine@Talos:~/Bureau/test$ python3 dir_a/file_a.py
b
antoine@Talos:~/Bureau/test$ cd dir_a/
antoine@Talos:~/Bureau/test/dir_a$ python3 file_a.py
b
antoine@Talos:~/Bureau/test/dir_a$
par contre dans spyder ça ne fonctionne pas même après modification du PYTHONPATH dans le logiciel et dans .bashrc
Hors ligne
#8 Le 11/09/2023, à 06:31
- evanbung
Re : Python - import relatif
This error occurs when you try to import a module using a relative import, but Python cannot find the module's parent package.A relative import is a way to import a module that is located in the same package or module as the importing module.
To fix this error "Attempted relative import with no known parent package", ensure you have a proper package structure in your project, which includes an __init__.py file in each directory you want to treat as a package. Verify that the directory containing your main script (the one you run) is included in the Python path (sys.path). If you prefer not to use packages, consider using absolute imports by specifying the full path to the module you want to import. Alternatively, reorganize your project structure to adhere to a clear package structure for relative imports to work correctly.
Hors ligne
#9 Le 11/09/2023, à 16:07
- Ayral
Re : Python - import relatif
Modération : le forum est francophone, prière d'utiliser la langue française.
Pour mettre les retours de commande entre deux balises code, les explications sont là : https://forum.ubuntu-fr.org/viewtopic.php?id=1614731
Blog d'un retraité
Site de graphisme du fiston Loïc
Ubuntu 22.04 LTS sur un Thinkpad W540
Hors ligne
Pages : 1