python emballage relative des importations
Tout d'abord à tous: je suis désolé, je sais qu'il y a beaucoup de question à propos relatif des importations, mais je ne l'ai pas trouver une solution. Si possible, je voudrais utiliser le répertoire suivant la mise en page:
myClass/
__init__.py
test/
demo.py
benchmark.py
specs.py
src/
__init__.py
myClass.py
Maintenant mes questions sont:
-
Comment faire le test des fichiers à partir de l'intérieur de l'emballage correctement à l'importation myClass.py?
-
Comment voulez-vous importer le package à partir de l'extérieur, en supposant que vous prenez myClass en tant que sous-module dans libs/maclasse ou include/maclasse?
Jusqu'à présent, je n'arrivais pas à trouver une solution élégante pour cette. Ce que je comprends Guido Décision du il devrait être possible de faire from ..src import myClass
mais cette erreur:
ValueError: Attempted relative import in non-package
Qui ressemble comme il ne permet pas de traiter myClass sous forme de forfaits. La lecture de la documentation:
L' __init__.py les fichiers sont requis pour assurer le Python traiter les répertoires contenant les paquets;
Il semble que je suis absent quelque chose qui spécifie où les scripts du paquet, dois-je utiliser .la pth ?
- Newey, oui, vous avez raison, relative importations semble être un sujet permanent et après avoir lu quelques réponses que j'ai toujours eu envie de me décrire précisément ma situation. Après avoir montré ce q, sur la #python canal IRC un certain nombre de personnes recommandé d'utiliser la plate structure de répertoire: "beaucoup de gens résistent à la façon Python veut utiliser les répertoires et les fichiers pour la sémantique de l'espace de noms de l'information. Il est préférable de donner et de faire ce que Python veut." jcalderone.livejournal.com/39794.html
- Quelqu'un pourrait-il fournir un lien vers un monde réel des paquets, avec des exemplaires à la disposition des répertoires, ou à la suite de certaines conventions? (idéalement sur github)
- Est-il
__init__.py
dans letest
répertoire?ValueError: Attempted relative import in non-package
pourrait être liée à elle. - stackoverflow.com/questions/1803292/... docs.python.org/distutils/examples.html
Vous devez vous connecter pour publier un commentaire.
Signifie que vous tentez d'utiliser relatif à l'importation dans le module qui n'est pas de paquet. Son problème avec le fichier qui a cette
from ... import
instruction, et non pas le fichier que vous souhaitez importer.Donc, si vous faites relative des importations dans vos tests, par exemple, vous devriez faire vos tests pour être le cadre de votre forfait. Cela signifie
__init__.py
pour tester/Si vous lancez quelque chose comme
python myClass/test/demo.py
, relative importations ne fonctionne pas trop puisque vous êtes en cours d'exécution de démonstration du module non pas comme un paquet. Relative des importations exiger que le module qui les utilise est importé lui-même, soit en tant que package module,from myClass.test.demo import blabla
, ou avec une relative à l'importation.Après des heures de recherche, la nuit dernière, j'ai trouvé la réponse relative des importations en python!! Ou une solution de facilité, à tout le moins. La meilleure façon de résoudre ce problème est d'avoir les modules appelés à partir d'un autre module. Donc, dire que vous voulez
demo.py
à l'importationmyClass.py
. Dans lemyClass
dossier à la racine de la sous-paquets dont ils ont besoin d'avoir un fichier qui appelle les deux autres. De ce que je comprends le répertoire de travail est toujours considéré comme__main__
donc, si vous testez l'importation dedemo.py
avec ledemo.py
script, vous recevrez l'erreur. Pour illustrer:Hiérarchie de dossiers:
myClass.py:
demo.py:
main.py:
Si vous exécutez
demo.py
dans l'interpréteur, vous allez générer une erreur, mais l'exécutionmain.py
ne sera pas. C'est un peu alambiqué, mais il fonctionne 😀__init__.py
. Deuxièmement, j'ai changé de démonstration.imprimante() pourtest.demo.printer()
. Troisièmement, j'ai changé de répertoire au-dessus de la main.py et a courupython -m myClass.main
. Sinon, c'était une réponse utile pour moi. 🙂Intra-package-références décrit comment
myClass
detest/*
. Pour importer le package à partir de l'extérieur, il faut ajouter le chemin d'accès àPYTHONPATH
variable d'environnement avant de lancer la demande de l'importateur, ou àsys.path
liste dans le 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 devez l'ajouter à python path comme décrit ci-dessus.