Ich möchte von einer Klasse in einer Datei erben, die sich in einem Verzeichnis über dem aktuellen befindet.
Ist es möglich, diese Datei relativ zu importieren?
Ich möchte von einer Klasse in einer Datei erben, die sich in einem Verzeichnis über dem aktuellen befindet.
Ist es möglich, diese Datei relativ zu importieren?
Gepflegte Antwort von @alex-martelli mit pathlib:
import pathlib
import sys
_parentdir = pathlib.Path(__file__).parent.parent.resolve()
sys.path.insert(0, str(_parentdir))
import module_in_parent_dir
sys.path.remove(str(_parentdir))
Um python /myprogram/submodule/mymodule.py
auszuführen, das /myprogram/mainmodule.py
importiert, z.B., über
from mainmodule import *
auf Linux (z.B., im python Docker-Image), musste ich das Stammverzeichnis des Programms zum PYTHONPATH
hinzufügen:
export PYTHONPATH=/myprogram
Sie können die Methode sys.path.append()
verwenden, um das Verzeichnis, das das Paket enthält, zur Liste der durchsuchten Pfade für Module hinzuzufügen. Wenn sich das Paket beispielsweise in zwei Verzeichnissen
über dem aktuellen Verzeichnis befindet, können Sie den folgenden Code verwenden:
import sys
sys.path.append("../../")
Wenn sich das Paket im Verzeichnis über dem aktuellen Verzeichnis befindet, können Sie den folgenden Code verwenden:
import sys
sys.path.append("..")
Um Python-Code zuverlässig zu laden, sollte dieser in einem Modul vorliegen und dieses Modul in der Python-Bibliothek installiert sein.
Installierte Module können immer aus dem Hauptnamespace mit import
geladen werden
Es gibt hier ein großartiges Beispielprojekt offiziell verfügbar: https://github.com/pypa/sampleproject
Im Grunde genommen kann die Verzeichnisstruktur wie folgt aussehen:
the_foo_project/
setup.py
bar.py # `import bar`
foo/
__init__.py # `import foo`
baz.py # `import foo.baz`
faz/ # `import foo.faz`
__init__.py
daz.py # `import foo.faz.daz` ... etc.
.
Stellen Sie sicher, dass Sie Ihr setuptools.setup()
in Ihrer setup.py
deklarieren
Offizielles Beispiel: https://github.com/pypa/sampleproject/blob/master/setup.py
In unserem Fall möchten wir wahrscheinlich bar.py
und foo/__init__.py
exportieren, mein kurzes Beispiel:
#!/usr/bin/env python3
import setuptools
setuptools.setup(
...
py_modules=['bar'],
packages=['foo'],
...
entry_points={},
# Beachten Sie, dass Änderungen an Ihrer setup.py, wie das Hinzufügen zu `packages` oder
# Änderungen an `entry_points`, erfordern, dass das Modul neu installiert wird;
# `python3 -m pip install --upgrade --editable ./the_foo_project
)
.
Jetzt können wir unser Modul in die Python-Bibliothek installieren; Mit pip können Sie the_foo_project
im Bearbeitungsmodus in Ihre Python-Bibliothek installieren, damit wir daran in Echtzeit arbeiten können
python3 -m pip install --editable=./the_foo_project
# Wenn Sie einen Berechtigungsfehler erhalten, können Sie immer
# `pip ... --user` verwenden, um in Ihrer Benutzer-Python-Bibliothek zu installieren
.
Jetzt können wir aus jedem Python-Kontext heraus unsere gemeinsamen py_modules und packages laden
#!/usr/bin/env python3
import bar
import foo
print(dir(bar))
print(dir(foo))
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.