Erstellen mehrerer Python-Module in verschiedenen Verzeichnissen, die einen Teil der Paketstruktur gemeinsam nutzen

Ich arbeite an einem Django-Projekt, das eine einzige Anwendung enthält. Die Anwendung wird unter der GPL veröffentlicht, daher möchte ich sie getrennt vom Projekt entwickeln - eine persönliche Website, die die App verwendet. Ich versuche, eine Paketstruktur basierend auf meinem Domain-Namen für das Projekt und die App zu verwenden, und dort treten Probleme auf.

Hier ist meine Dateistruktur (ggf. mit __init__.py-Dateien):

$HOME/django-sites/mydomain
$HOME/django-apps/mydomain/cms

Und mein PYTHONPATH:

$HOME/django-sites:$HOME/django-apps

Wenn ich einen Python-Interpreter starte (aus einem beliebigen Verzeichnis im Dateisystem), kann ich Klassen von der Site importieren, aber nicht von der Anwendung. Wenn ich die Reihenfolge der beiden Einträge im PYTHONPATH umdrehe (zuerst Apps, dann Sites), kann ich von der App importieren, aber nicht von der Site.

Es sieht so aus, als ob Python nur versucht, Daten aus dem ersten Eintrag in PYTHONPATH zu importieren, der den ersten Teil des Paketnamens enthält. Ist das korrekt? Ist das erwartetes Verhalten? In diesem Fall kann ich Module nur dann in Paketstrukturen wie domain / app1, domain / app2 einfügen, wenn sie in derselben Verzeichnisstruktur vorliegen - unabhängig vom PYTHONPATH.

Es ist kein Show-Stopper, weil ich die Site umbenennen kann, aber es ist viel anders als ich erwartet hatte. Das Python-Tutorial erwähnt __path__, aber ich habe keine Ahnung, wie ich es verwenden soll:

Pakete unterstützen ein weiteres spezielles Attribut, __path__. Dies wird als Liste mit dem Namen des Verzeichnisses initialisiert, in dem sich die Datei __init__.py des Pakets befindet, bevor der Code in dieser Datei ausgeführt wird. Diese Variable kann geändert werden. Dies wirkt sich auf zukünftige Suchvorgänge nach Modulen und Unterpaketen aus, die im Paket enthalten sind.

Obwohl diese Funktion nicht oft benötigt wird, kann sie verwendet werden, um die in einem Paket enthaltenen Module zu erweitern.

Ist dies noch jemandem begegnet? Kann ich mit __path__ etwas tun, um diese Funktion wie erwartet zu aktivieren?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage