310 Stimmen

Wie importiert man eine Python-Klasse, die sich in einem übergeordneten Verzeichnis befindet?

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?

4voto

SzieberthAdam Punkte 3741

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))

3voto

gench Punkte 948

Es ist 2022 und keines der Antworten hat wirklich für mich funktioniert. Hier ist, was am Ende funktioniert hat

import sys
sys.path.append('../my_class')
import my_class

Meine Verzeichnisstruktur:

src
--my_class.py
notebooks
-- mynotebook.ipynb

Ich habe my_class aus mynotebook.ipynb importiert.

2voto

F1iX Punkte 391

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

0voto

Rj_Innocent_Coder Punkte 1122

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("..")

-6voto

ThorSummoner Punkte 13974

Python ist ein modulares System

Python verlässt sich nicht auf ein Dateisystem

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:

setup.py

#!/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

foo_script.py

#!/usr/bin/env python3

import bar
import foo

print(dir(bar))
print(dir(foo))

CodeJaeger.com

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.

Powered by:

X