Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/08/2020, à 18: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

#3 Le 07/08/2020, à 21:46

toitoinebzh

Re : Python - import relatif

nany a écrit :
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, à 22: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, à 08: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, à 09:38

nany

Re : Python - import relatif

toitoinebzh a écrit :

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, à 14: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, à 07: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, à 17: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