2016-02-03 2 views
11

Ich spielte die Python-Import-System, um besser zu verstehen, wie es funktioniert, und ich stieß auf ein anderes Problem. Ich habe die folgende StrukturValueError: versucht relativen Import über Top-Level-Paket

pkg/ 
    __init__.py 
    c.py 
    d.py 

    subpkg/ 
     __init__.py 
     a.py 
     b.py 

Innen a.py Ich habe den folgenden Code:

from . import b 
from .. import d 

Und innerhalb c.py Ich habe folgendes:

import subpkg.a 

Jetzt erhalte ich die folgende Fehlermeldung:

ValueError: attempted relative import beyond top-level package

Aber warum? Wie kann ich es lösen? Ich laufe c.py von der IDLE, und pkg sollte als ein Paket betrachtet werden, da es die __init__.py Datei hat.

Der erste Import funktioniert gut, aber es ist die folgende, die nicht funktioniert:

from .. import d 

Weil ich etwas von einem übergeordneten Paket zu importieren versucht bin, aber ich kann es offenbar nicht, aus irgendeinem seltsamen Grund.

Antwort

1

Python 3 hat das Importsystem so geändert, dass Sie jedes Mal, wenn Sie ein Modul benötigen, das Sie gerade verwenden, relative Importe benötigen (es sei denn, Sie haben Probleme mit PYTHON_PATH oder sys.path).

Die hier korrekte Verwendung

from .subpkg import a 

werden sollten, wenn Sie mit IDLE arbeiten, haben Sie eine ganz andere Umgebung. Daher können Sie den aktuellen Standort zu Ihrem Pfad hinzufügen, damit die Importe wieder funktionieren.

Versuch:

sys.path.insert(0, '') 

Es könnte seltsam sein, aber es ist für eine größere gute

PS: Wenn diese letzte, was nicht funktionieren - ich eine IDLE-Umgebung nicht gerade jetzt - Wahrscheinlich liegt es daran, dass das Arbeitsverzeichnis falsch eingestellt ist.

diese Antwort Versuchen Sie stattdessen: https://stackoverflow.com/a/17361545/754991

+0

Wenn ich 'von .subpkg Import a' I erhalten:' Systemerror: Parent-Modul '' nicht geladen wird, kann relativ import' vom IDLE und vom Terminal nicht durchführen .. – nbro

+0

@nbro das liegt daran, dass Sie in IDLE sind, aber wenn Sie es in einem Modul ausführen, sollte der Import so sein. IDLE ist eine schreckliche IDE und schlecht für die Python-Entwicklung im Allgemeinen. Die am besten für IDLE- und Inside-Module geeignete Option ist die Verwendung des vollständigen Paketnamens: 'from pkg import subpkg.a' nach dem Hinzufügen des Verzeichnisses für' pkg' in 'sys.path' – JBernardo

+0

Was meinst du mit:" Wenn du führe es in einem Modul "? Ich sagte, ich laufe die Datei 'c.py' (als Haupt) sowohl vom Terminal als auch vom IDLE, wie du es vorgeschlagen hast, und es gibt mir den Fehler, den ich oben erwähne. IDLE ist eine schreckliche IDE, aber es kommt mit Python? Was wäre der Zweck, eine schreckliche IDE zu tragen? Man kann sagen, dass IDLE eine simple IDE ist, die sicher nicht zu den Besten gehört, aber theoretisch sollte sie mit Python gut funktionieren, sonst macht nichts Sinn. – nbro

Verwandte Themen