Tout d'abord: je suis désolé, je sais qu'il a été beaucoup question des importations relatives, mais je n'ai tout simplement pas trouvé de solution. Si possible, j'aimerais utiliser la disposition de répertoire suivante:
myClass/
__init__.py
test/
demo.py
benchmark.py
specs.py
src/
__init__.py
myClass.py
Maintenant mes questions sont:
Comment les fichiers de test du package importent-ils correctement myClass.py?
Comment importeriez-vous le paquet de l'extérieur, si vous prenez myClass en tant que sous-module dans libs/myClass ou include/myClass?
Jusqu'à présent, je n'ai pas pu trouver de solution élégante à cela. D'après ce que j'ai compris Décision de Guido il devrait être possible de faire from ..src import myClass
mais ceci provoquera une erreur:
ValueError: Attempted relative import in non-package
Ce qui semble ne pas traiter myClass comme des packages. Lecture de la documentation :
Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme contenant des packages;
Il semble que je manque quelque chose qui spécifie où les scripts du paquet sont, dois-je utiliser. Pth?
ValueError: Attempted relative import in non-package
Cela signifie que vous essayez d'utiliser une importation relative dans le module qui n'est pas un package. Son problème avec le fichier qui a cette instruction from ... import
et non le fichier que vous essayez d'importer.
Ainsi, si vous effectuez des importations relatives dans vos tests, par exemple, vous devez faire en sorte que vos tests fassent partie de votre package. Ça signifie
__init__.py
à tester /Si vous exécutez quelque chose en tant que python myClass/test/demo.py
, les importations relatives ne fonctionneront pas aussi puisque vous exécutez le module de démonstration et non en tant que package. Les importations relatives nécessitent que le module qui les utilise soit importé lui-même en tant que module de package, from myClass.test.demo import blabla
, ou avec une importation relative.
Après des heures de recherche la nuit dernière, j'ai trouvé la réponse aux importations relatives en python !! Ou une solution facile à tout le moins. La meilleure façon de résoudre ce problème consiste à appeler les modules à partir d'un autre module. Supposons donc que vous souhaitiez que demo.py
importe myClass.py
. Dans le dossier myClass
à la racine des sous-packages, ils doivent avoir un fichier qui appelle les deux autres. D'après ce que je comprends, le répertoire de travail est toujours considéré comme __main__
. Par conséquent, si vous testez l'importation à partir de demo.py
avec le script demo.py
, vous recevrez cette erreur. Pour illustrer:
Hiérarchie des dossiers:
myClass/
main.py #arbitrary name, can be anything
test/
__init__.py
demo.py
src/
__init__.py
myClass.py
myClass.py:
def randomMaths(x):
a = x * 2
y = x * a
return y
demo.py:
from ..src import myClass
def printer():
print(myClass.randomMaths(42))
main.py:
import test.demo
demo.printer()
Si vous exécutez demo.py
dans l'interpréteur, vous allez générer une erreur, mais exécuter main.py
ne le fera pas. C'est un peu compliqué, mais ça marche: D
Intra-package-references décrit comment myClass
à partir de test/*
. Pour importer le package de l'extérieur, vous devez ajouter son chemin d'accès à la variable d'environnement PYTHONPATH
avant d'exécuter l'application d'importation, ou à la liste sys.path
du code avant de l'importer.
Pourquoi from ..src import myClass
échoue: probablement, src
n'est pas un paquet python, vous ne pouvez pas importer à partir de là. Vous devriez l'ajouter au chemin python comme décrit ci-dessus.