Python-Importmodule, Ordnerstrukturen

8

Ich habe nach einem Weg gesucht, dies zu lösen.

Ich habe ein Python-Projekt, und das ist die Ordnerstruktur, die ich möchte:

%Vor%

Ich möchte die Tests ausführen können, indem ich die tests.py im Terminal ausfühle. tests.py importiert Module in / project / src / zum Testen. Zuerst habe ich das gelöst, indem ich hinzugefügt habe   sys.path.insert(0, '..') in tests.py. Dann müssen die Pfade, die in models.py zum Öffnen von Textdateien verwendet werden, relativ zu tests.py usw. sein. Das bedeutet, dass das Programm nicht ausgeführt wird, wenn es ausgeführt wird main.py , Ursache der Pfade.

Ich habe es auch mit dots versucht, als ich Module in tests.py, wie from ..src.models import * , importierte, aber die Fehlermeldung "Versuch eines relativen Imports in Nicht-Paket" wurde angezeigt.

Was soll ich oben in tests.py eintragen, um die Module von models.py importieren zu können?

    
user1121487 19.12.2013, 23:26
quelle

2 Antworten

3

Die Struktur, die Sie verwenden, ist keine, die ich empfehlen würde, aber ich bin ein vergleichbarer Neuling, wie Python-Projekte normalerweise strukturiert sind. Ich glaube, das wird tun, wonach Sie suchen:

1) Platzieren Sie eine __init__.py -Datei in /project , /project/src und /project/test , um sicherzustellen, dass sie als Pakete behandelt werden.

2) Platziere from __future__ import absolute_import am Anfang jeder Python-Datei.

3) Verwenden Sie dann relative Importe:

test.py :

%Vor%

main.py :

%Vor%

4) Sie müssen Ihre Anwendung anders starten. Stellen Sie sicher, dass Ihr aktuelles Verzeichnis das übergeordnete Element von /project ist (das den Dateisystemstamm darstellt) und führen Sie Ihr Projekt auf diese Weise aus:

%Vor%

Für mein eigenes Projekt würde ich definitiv main.py in src setzen, wenn es der Startpunkt Ihrer Anwendung ist. Ich könnte auch tests.py in src setzen, aber wenn nicht, würde ich /project/src zum Python-Pfad des Testlaufers hinzufügen anstatt in Code.

Ich würde immer noch absolute_import verwenden. Meiner Erfahrung nach ist es eine sehr saubere Lösung für die Modulorganisation, und es funktioniert auch standardmäßig in Python 3.

    
jpmc26 19.12.2013 23:34
quelle
0

Platziere deine main.py zuerst im Verzeichnis src ..

in Ihren Tests können Sie tun, sys.path.append ('das src-Verzeichnis')

Wenn Sie die Ausführung in einem bestimmten Verzeichnis erzwingen möchten, unabhängig davon, wo Sie die App ausführen, empfehle ich Ihnen,

hinzuzufügen %Vor%

so wird Ihr Programm in dem von Ihnen angegebenen Verzeichnis laufen, so dass es die relativen Pfade, die Sie in Ihrem Code haben, respektiert

    
Costa Halicea 19.12.2013 23:52
quelle