2010-11-26 8 views
0

Python definiert Ich versuche, ein einfaches Multi-Level-Paket zu erstellen:Nameerror in Multi-Level-Paket

test_levels.py 
level1/ 
     __init__.py (empty file) 
     level2/ 
       __init__.py (only contents: __all__ = ["leaf"]) 
       leaf.py 

leaf.py:

class Leaf(object): 
    print("read Leaf class") 
    pass 

if __name__ == "__main__": 
    x = Leaf() 
    print("done") 

test_levels.py:

from level1.level2 import * 
x = Leaf() 

Das Ausführen von leaf.py funktioniert direkt, aber das Ausführen von test_levels.py gibt die Ausgabe unten, , wo ich exp Keine Ausgabe:

read Leaf class 
Traceback (most recent call last): 
    File "C:\Dev\intranet\test_levels.py", line 2, in <module> 
    x = Leaf() 
NameError: name 'Leaf' is not defined 

Kann jemand darauf hinweisen, was ich falsch mache?

Antwort

0

versuchen

from leaf import * 

in Datei ebenen1/Level2/__ init__.py

upd hinzuzufügen: wie in den vorherigen Kommentar, fügen Punkt vor Modulnamen und "__all__" Erklärung zu entfernen.

$ cat level1/level2/__init__.py 
from .leaf import Leaf 
$ cat level1/level2/leaf.py 
class Leaf: 
    def __init__(self): 
     print("hello") 
$ cat test.py 
from level1.level2 import * 
x = Leaf() 
$ python test.py 
hello 
+0

seine Ich denke, 'von .leaf' wird nur Arbeit in Python 3 (oder wenn du absolute_imports von '__future__' in Python 2 importierst). –

+0

Ja, aber ich denke thatestarter verwendet genau python3, weil er print (...) anstelle von print geschrieben hat ... – werehuman

+0

Ich benutze 2.6, aber "from .leaf" scheint zu funktionieren. – RuiDC

0

In level1/level2/__init__.py, ich glaube, Sie wollen tun from leaf import * (oder, in Py3k, from .leaf import *). Wenn Sie von level1.level2 importieren, importieren Sie wirklich die __init__.py Datei in diesem Verzeichnis. Da Sie Leaf dort nicht definiert haben, erhalten Sie es nicht, indem Sie das importieren.

+0

Ich benutze Python 2.6, und das Hinzufügen von leaf import * zu level1/level2/__ init__.py funktioniert, aber vorausgesetzt, dass es Inhalt ist bereits: __all__ = ["Blatt"] und dass "Blatt Klasse lesen" ist in der Ausgabe, sollte es nicht schon funktionieren? oder kann das __all__ in diesem Zusammenhang nicht verwendet werden? – RuiDC

+0

'__all__' legt die Liste der Namen fest, die von' from import * 'verwendet werden, aber diese Namen müssen noch in diesem Kontext definiert werden. In Ihrer Struktur befindet sich die Leaf-Klasse in "level1.level2.leaf". Also könnten Sie in test_levels.py 'leaf.Leaf()' aufrufen. Oder Sie könnten 'von level1.level2.leaf import *' tun. –

0

Erwarten Sie den Import aller Variablennamen aus allen Modulen in diesem Paket? Das ist eine schreckliche Idee. Zu tun, was Sie wollen, sollte es

from level1.level2.leaf import * 

oder sogar noch besser sein, um den Wildcard-Import zu entfernen, die in der Regel schlecht ist, sollte es

from level1.level2.leaf import Leaf