Ein Skript oder Modul kann Module importieren, die entweder
- auf dem Systempfad oder
- Teil des gleichen Pakets wie der Import/script-Modul.
Für Module gelten diese Regeln ohne Ausnahme. Für Skripts gelten die Regeln, aber das Problem besteht darin, dass beim Ausführen eines Skripts standardmäßig nicht davon ausgegangen wird, dass es Teil eines Pakets ist.
Dies bedeutet, dass ein Skript standardmäßig nur Module importieren kann, die sich auf dem Systempfad befinden. Standardmäßig enthält der Pfad das aktuelle Verzeichnis. Wenn Sie also ein Skript ausführen, können Module in dasselbe Verzeichnis oder in Pakete importiert werden, die Unterverzeichnisse sind. Aber das ist es. Ein Skript hat in der Verzeichnisstruktur keine Ahnung von "wo es ist". Daher kann es keine Importe ausführen, die bestimmte relative Pfadinformationen über umschließende Verzeichnisse benötigen. Das heißt, Sie können keine Dinge "aus dem übergeordneten Verzeichnis" oder "aus einem gleichgeordneten Verzeichnis" importieren. Dinge, die sich in diesen Verzeichnissen befinden, können nur importiert werden, wenn sie sich auf dem Systempfad befinden.
Wenn Sie ein Skript "wissen" möchten, das in einem Paket ist, können Sie ihm ein __package__
Attribut geben. Siehe this previous question. Sie können dann explizite relative Importe (z. B. from ...sub2 import mod2
) normalerweise innerhalb dieses Skripts verwenden.
Mir geht es gut mit der Bearbeitung von PYTHONPATH, aber gibt es einen Standard Weg dies zu erzwingen? Ich möchte nicht, dass alle neuen Benutzer des Repos manuell ihren PYTHONPATH aktualisieren müssen. – Eli
Wenn Sie nicht möchten, dass Benutzer 'PYTHONPATH' selbst verwalten müssen, müssen Sie' sys.path' mangling berücksichtigen. (Verwenden Sie zum Beispiel '__file__' plus' os.abspath', um nach dem Ort des Skripts zu suchen, und rufen Sie dann das Verzeichnis mit der richtigen Anzahl von darüber liegenden Ebenen als 'repo'-Elternteil und dann' sys.path.insert auf 'it.) – Amber