Wie strukturiere ich mein Python-Projekt, damit benannte Module aus Unterverzeichnissen importiert werden können?

Dies ist meine Verzeichnisstruktur:

Projects
    + Project_1
    + Project_2
    - Project_3
        - Lib1
            __init__.py # empty
            moduleA.py
        - Tests
            __init__.py # empty
            foo_tests.py
            bar_tests.py
            setpath.py
        __init__.py     # empty
        foo.py
        bar.py

Tore

Haben Sie eine organisierte ProjektstrukturKönnen Sie bei Bedarf jede .py-Datei unabhängig ausführenKönnen sowohl Geschwister als auch @ referenzieren / importierCousi modulesHalten Sie alle import / from-Anweisungen am Anfang jeder Datei.

Ich habe mit der obigen Struktur die Nummer 1 erreicht

Ich habe meistens 2, 3 und 4 erreicht, indem ich wie folgt vorgegangen bin (wie von @ empfohlendieser ausgezeichnete Führer)

In jedem Paket, das auf übergeordnete oder verwandte Module zugreifen muss (z. B. im obigen Testverzeichnis), füge ich eine Datei mit dem Namen setpath.py hinzu, die den folgenden Code enthält:

import os
import sys
sys.path.insert(0, os.path.abspath('..'))

sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('...'))

Dann kann ich in jedem Modul, das Eltern- / Cousin-Zugriff benötigt, wie z. B. foo_tests.py, eine schöne, saubere Liste von Importen wie folgt schreiben:

import setpath      # Annoyingly, PyCharm warns me that this is an unused import statement
import foo.py

Innerhalb von setpath.py sind die zweiten und dritten Einfügungen für dieses Beispiel nicht unbedingt erforderlich, werden jedoch als Fehlerbehebungsschritt eingefügt.

Mein Problem ist, dass dies nur für Importe funktioniert, die direkt auf den Modulnamen verweisen, und nicht für Importe, die auf das Paket verweisen. In bar_tests.py funktioniert beispielsweise keine der beiden folgenden Anweisungen, wenn bar_tests.py @ ausgeführt wirdirek.

import setpath

import Project_3.foo.py  # Error
from Project_3 import foo  # Error

Ich erhalte die Fehlermeldung "ImportError: Kein Modul mit dem Namen 'Project_3'".

Was seltsam ist, dass ich die Datei direkt aus PyCharm ausführen kann und es funktioniert. Ich weiß, dass PyCharm mit dem @ einige hinter den Kulissen magische Aktionen ausführPython Path Variable, damit alles funktioniert, aber ich kann nicht herausfinden, was es ist. Da PyCharm einfach python.exe ausführt und einige Umgebungsvariablen festlegt, sollte es möglich sein, dieses Verhalten innerhalb eines Python-Skripts selbst zu klonen.

Aus Gründen, die für diese Frage nicht wirklich relevant sind, muss ich auf @ verweisebar Verwendung derProject_3 Qualifier.

Ich bin offen für jede Lösung, die die oben genannten Ziele erreicht und gleichzeitig meine früheren Ziele erreicht. Ich bin auch offen für eine alternative Verzeichnisstruktur, wenn es eine gibt, die besser funktioniert. Ich habe das @ gelesPython doc beim Importieren und pakete bin aber noch ratlos. Ich denke, eine mögliche Möglichkeit ist die manuelle Einstellung des__path__ Variable, aber ich bin nicht sicher, welche geändert werden muss oder worauf ich sie einstellen soll.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage