2013-02-14 9 views
22

Ich habe viele Python gegangen durch eine relativen Import Fragen, aber ich kann das Problem nicht verstehen/damit es funktioniert ...Python-Import-Modul aus dem Ordner Geschwister

My Directory-Struktur ist:

Driver.py 

A/ 
     Account.py 
     __init__.py 

B/ 
     Test.py 
     __init__.py 

====================

Driver.py

from B import Test 

=========

Account.py

class Account: 
def __init__(self): 
    self.money = 0 

====================

Test.py

from ..A import Account 

== ================

Wenn ich versuche,

python Driver.py

zu laufen

Ich erhalte den Fehler

Traceback (most recent call last):

from B import Test

File "B/Test.py", line 1, in <module> from ..A import Account

ValueError: Attempted relative import beyond toplevel package

+2

Sie sollten Ihre Python-Version wirklich erwähnen, wenn Sie nach Funktionen fragen, die sich zwischen den Versionen radikal geändert haben (relative Importe, Unicode und einige andere). Manchmal können die Leute aufgrund des spezifischen Fehlers, den Sie bekommen haben, oder wie Sie Ihren Code geschrieben haben, raten, aber Sie sollten nicht darauf zählen, dass die Leute richtig raten. – abarnert

Antwort

15

Dies geschieht, weil A und B unabhängig sind, nicht verwandt wird Pakete soweit Python betroffen.

Erstellen Sie eine __init__.py im selben Verzeichnis wie Driver.py und alles sollte wie erwartet funktionieren.

+0

Danke! Können Sie die __init__.py-Dateien ein wenig erklären? Ich habe die online gefundenen Erklärungen nicht verstanden. Ich komme von einem C++ Hintergrund, also bin ich gewöhnt, nur den Pfad für Includes und solche – Joshua

+7

zu geben. Es ist ein bisschen Hand-wellig, aber im Grunde: eine "__init __. Py" Datei in ein Verzeichnis zu setzen bedeutet "in diesem Verzeichnis alle Die '.py'-Dateien und alle Unterverzeichnisse, die eine' _init___py'-Datei enthalten, sind Teil desselben Pakets. –

+0

Alles, was er braucht, wenn von einem Import-Account in driver.py. Das Hinzufügen der zusätzlichen init.py und das Verwenden eines relativen Imports ist ein wenig peinlich und verschmutzt den Toplevel. – Wyrmwood