web-dev-qa-db-fra.com

'Tentative d'importation relative dans un non-package' bien que les packages avec __init__.py dans un répertoire

J'ai un module nommé extended.py qui contient la ligne suivante:

from .basic import BasicModule

et le fichier basic.py réside dans le même répertoire que __init__.py. Cependant, lorsque j'essaie de l'exécuter en tant que:

python extended.py

Je reçois l'erreur:

ValueError: Attempted relative import in non-package

Ajout également de la ligne:

from __future__ import absolute_import

ne résout pas le problème. Peut-être que je suis trop fatigué pour voir l'évidence - mais je ne vois pas le problème ici.

29
Alex

Les importations relatives ne fonctionnent que pour les packages, mais lorsque vous importez dans extended.py vous exécutez un module de niveau supérieur à la place.

Le répertoire actuel peut contenir un __init__.py fichier mais cela ne fait pas exended.py partie d'un package pour le moment.

Pour que quelque chose soit considéré comme un package, vous devez importer le nom du répertoire à la place. Les éléments suivants fonctionneraient:

main.py

packagename\
    __init__.py
    basic.py
    extended.py

puis dans main.py mettre:

import packagename.extended

et seulement alors fait partie de extended d'un package et effectue des importations relatives.

L'importation relative a maintenant quelque chose à être relatif à, le parent packagename.

51
Martijn Pieters