wake-up-neo.net

Python importiert den relativen Pfad

Ich habe ein Projekt, bei dem ich einige Python-Klassen in anderen Verzeichnissen verwenden möchte.

Beispielstruktur:

/dir
 +../subdirA
 +../subdirB
 +../mydir

Der absolute Pfad variiert, da dieses Projekt auf verschiedenen Maschinen ausgeführt wird.

Wenn meine Python-Datei mit MySampleClass in / mydir ausgeführt wird, wie importiere ich OtherClassRoot in / dir oder OtherClassA in / subdirA

Ich habe Dinge ausprobiert wie:

from . import MySampleClass as msc

oder

from ../ import MySampleClass as msc

dies schlägt jedoch immer fehl oder es werden Fehlermeldungen wie versuchter relativer Import in Nicht-Paket angezeigt.

Wie kann man also Python-Dateien relativ importieren?

Jede Eingabe wird sehr geschätzt :)

16
daniel451

Sie benötigen einen __init__.py im mydir-Verzeichnis (und es kann leer sein). Solange sich das Verzeichnis im Pfad sys befindet, wird davon ausgegangen, dass sich Ihre MySampleClass in myfile.py und myfile.py in mydir befinden

from mydir.myfile import MySampleClass

Wenn Sie Funktionen der obersten Ebene aus einer Datei namens util.py importieren möchten, die sich in subdirA in myfile.py befindet (wo sich Ihre Klasse befindet), muss ein __init__.py in subdirA und dann in myfile.py sein

from subdirA.util import somefunc, someotherfunc

Dasselbe gilt für den sys-Pfad, dh Sie müssen entweder von 'dir' aus beginnen oder es hinzufügen. Alles wird von der obersten Ebene des Pakets importiert (normalerweise Ihr Projektordner). 

Für Modultests, bei denen Sie möglicherweise eine Funktion von util im Interpreter ausführen, müssen Sie beim Start von subdirA das Verzeichnis sys hinzufügen, damit die Importe aufgelöst werden können. 

>>> import sys
>>> sys.path.append('../dir')

dies ist jedoch ein Hack und wäre vorzuziehen, wenn Sie ihn nur beim Testen verwenden. Sie können Ihren Site-Paketen auch 'dir' in einer pth-Datei hinzufügen. 

Um relative Importe verwenden zu können, benötigen Sie einen tiefer verschachtelten Ordner, z. B. UnterverzeichnisA/UnterverzeichnisA, und dann in UnterverzeichnisA. zurückgehen (wie from .subdirB). Wirklich, für mich sind relative Importe ziemlich schwer zu erkennen. Es ist besser für mich, Direktimporte relativ zum Projektverzeichnis zu verwenden, aber ich könnte sehen, dass sie nützlich sind, wenn Sie ein naives Unterpaket verschachteln möchten, aber besser noch, wenn möglich, explizit als implizit. 

siehe auch das

19
Wyrmwood

fügen Sie zunächst die relativen Pfade zum Pythonpfad hinzu

import os

import sys

cwd = os.getcwd()

sys.path.append(cwd + '/../subdirA/')

sys.path.append(cwd + '/../subdirB/')

dann importieren Sie die Module.

2
reggie