70 votes

emballage en python pour les importations relatives

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 les suivantes:

  • 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 de Guido de Décision , il devrait être possible de le 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 des paquets;

Il semble que je suis absent quelque chose qui spécifie où les scripts du paquet, dois-je utiliser .la pth ?

42voto

Daniel Kluev Points 4321

ValueError: Attempted relative import in non-package

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 déclaration, 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

  1. L'ajout d' __init__.py pour tester/
  2. L'exécution de certains à l'extérieur du script, comme nosetests

Si vous lancez quelque chose comme python myClass/test/demo.py, par rapport 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.

27voto

Sevvy325 Points 122

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. Le meilleur moyen de résoudre ce problème pour avoir les modules appelés à partir d'un autre module. Donc, dire que vous voulez demo.py pour importer myClass.py dans le MyClass dossier à la racine de la sous-packages jouet 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 principal , donc si vous testez l'importation à partir de demo.py avec l'demo.py script, vous recevrez l'erreur. Pour illustrer:

dossier hierarcy:

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 en cours d'exécution main.py ne sera pas. C'est un peu compliqué, mais ça marche :D

0voto

khachik Points 12589

Intra-package-références décrit comment myClass de test/*. Pour importer le package à partir de l'extérieur, il faut ajouter le chemin de PYTHONPATH variable d'environnement avant de lancer la demande de l'importateur, ou d' sys.path liste dans le code avant de l'importer.

Pourquoi from ..src import myClass d'échec: 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X