Relative des importations en Python
Salut à tous, je suis en tirant mes cheveux avec une relative des importations en Python. J'ai lu la documentation de 30 fois et de nombreux posts ici sur soi et à d'autres forums, encore ne semble pas fonctionner.
Mon répertoire de la structure ressemble actuellement ce
src/
__init__.py
main.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
Je veux expander.py et language_id.py pour avoir accès aux fonctions du module. - Je exécuter python main.py qui accède aux modules très bien avec des composants.expander importation * et des composants.language_id importation *.
Cependant, le code à l'intérieur de l'expandeur et language_id pour accéder aux fonctions du module:
from ..utilities.functions import *
Je reçois cette erreur:
ValueError: Attempted relative import beyond toplevel package
Je suis allé sur un tas de fois et il semble suivre la documentation. N'importe qui ont des idées de ce qui ne va pas ici?
- Vous avez déjà trouvé la solution, mais pour expliquer pourquoi il est nécessaire: l'emballage doit être entièrement autonome. Il ne traitera pas de la src/ comme un paquet quand vous êtes en cours d'exécution main.py à l'intérieur.
Vous devez vous connecter pour publier un commentaire.
Tant pis, je l'ai résolu:
main.py se réfère ensuite à la sous-paquets comme:
expander.py et language_id.py avoir accès à functions.py avec:
Mais la chose intéressante est que j'avais un fichier texte à l'intérieur de l'composants répertoire expander.py les utilisations. Cependant, à l'exécution, il ne pouvait pas localiser le fichier, même si c'était dans le même répertoire. J'ai déplacé le fichier texte dans le même répertoire que main.py et cela a fonctionné. Semble contre-intuitif.
pkgutil.get_data()
(docs.python.org/library/pkgutil#pkgutil.get_data) pour récupérer des fichiers à l'aide du module de l'espace de noms pour les localiser. Par exemple,raw_data = pkgutil.get_data('mod.components', 'data.txt')
permettra de récupérer les données binaires à partir du fichier.sys.path.append(path)