J'ai une "structure de fichier canonique" comme ça (je donne des noms sensés pour faciliter la lecture) :
mainpack/
__main__.py
__init__.py
- helpers/
__init__.py
path.py
- network/
__init__.py
clientlib.py
server.py
- gui/
__init__.py
mainwindow.py
controllers.py
Dans cette structure, par exemple, les modules contenus dans chaque paquet peuvent vouloir accéder à l'élément helpers
les services publics par le biais d'importations relatives dans quelque chose comme :
# network/clientlib.py
from ..helpers.path import create_dir
Le programme est exécuté "en tant que script" à l'aide de la commande __main__.py
de cette manière :
python mainpack/
Essayer de suivre le PEP 366 J'ai mis en __main__.py
ces lignes :
___package___ = "mainpack"
from .network.clientlib import helloclient
Mais en courant :
$ python mainpack
Traceback (most recent call last):
File "/usr/lib/python2.6/runpy.py", line 122, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.6/runpy.py", line 34, in _run_code
exec code in run_globals
File "path/mainpack/__main__.py", line 2, in <module>
from .network.clientlib import helloclient
SystemError: Parent module 'mainpack' not loaded, cannot perform relative import
Quel est le problème ? Quelle est la manière correcte de gérer et d'utiliser efficacement les importations relatives ?
J'ai également essayé d'ajouter le répertoire actuel au PYTHONPATH, mais rien ne change.