842 Stimmen

Wie behebt man "Attempted relative import in non-package" auch mit __init__.py

Ich versuche zu folgen PEP 328 mit der folgenden Verzeichnisstruktur:

pkg/
  __init__.py
  components/
    core.py
    __init__.py
  tests/
    core_test.py
    __init__.py

Unter core_test.py Ich habe die folgende Importanweisung

from ..components.core import GameLoopEvents

Bei der Ausführung erhalte ich jedoch die folgende Fehlermeldung:

tests$ python core_test.py 
Traceback (most recent call last):
  File "core_test.py", line 3, in <module>
    from ..components.core import GameLoopEvents
ValueError: Attempted relative import in non-package

Bei meiner Suche fand ich " Relativer Pfad funktioniert auch mit __init__.py nicht " und " Importieren eines Moduls aus einem relativen Pfad ", aber sie haben nicht geholfen.

Gibt es etwas, das ich hier übersehe?

3voto

Jayhello Punkte 4867

Sie können verwenden from pkg.components.core import GameLoopEvents Ich verwende z.B. pycharm, das untenstehende Bild ist meine Projektstruktur, ich importiere einfach aus dem Root-Paket, dann funktioniert es:

enter image description here

3voto

Rick Graves Punkte 327

Dieser Ansatz hat sich für mich bewährt und ist weniger unübersichtlich als andere Lösungen:

try:
  from ..components.core import GameLoopEvents
except ValueError:
  from components.core import GameLoopEvents

Das übergeordnete Verzeichnis ist in meinem PYTHONPATH, und es gibt __init__.py Dateien im übergeordneten Verzeichnis und in diesem Verzeichnis.

Die oben genannten funktionierte immer in Python 2, aber Python 3 manchmal Hit ein ImportError oder ModuleNotFoundError (letztere ist neu in Python 3.6 und eine Unterklasse von ImportError), so dass die folgenden zwicken funktioniert für mich in Python 2 und 3:

try:
  from ..components.core import GameLoopEvents
except ( ValueError, ImportError):
  from components.core import GameLoopEvents

3voto

John Difool Punkte 5274

Altes Thema. Ich habe herausgefunden, dass das Hinzufügen eines __all__= ['submodule', ...] zum __init__.py Datei und dann mit der from <CURRENT_MODULE> import * im Ziel funktioniert einwandfrei.

2voto

Vaishnavi Bala Punkte 129

Versuchen Sie dies

import components
from components import *

2voto

HappyWaters Punkte 39

Falls jemand nach einer Abhilfe sucht, bin ich auf eine gestoßen. Hier ist ein wenig Kontext. Ich wollte eine der Methoden testen, die ich in einer Datei gespeichert habe. Wenn ich sie aus der Datei

if __name__ == "__main__":

es hat sich immer über die relativen Importe beschwert. Ich habe versucht, die oben genannten Lösungen anzuwenden, aber es hat nicht funktioniert, da es viele verschachtelte Dateien gab, die jeweils mehrere Importe hatten.

Ich habe Folgendes getan. Ich habe einfach einen Launcher erstellt, ein externes Programm, das die notwendigen Methoden importiert und aufruft. Obwohl, nicht eine große Lösung, es funktioniert.

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