2016-07-10 16 views
0

Ich kann nicht scheinen, darüber zu kommen und nicht ganz verstehen, was passiert. Ich habe ein Verzeichnis mit zwei Klassendateien darin. Mit der REPL aus diesem Verzeichnis kann ich beide Dateien importieren und ihre Logik ausführen. Von ihrem übergeordneten Verzeichnis, von dem main() ausgeführt wird, ist jedoch nur eine Klassendatei sichtbar, pagetable.Benutzerdefinierte Python-Modul nicht importieren

Die Projektstruktur zur Zeit ist,

project/ 
    src/ 
     __init__.py # empty 
     pagingsimulation.py # main() imports memory 
     process.py 
     memory/ 
      __init__.py # imports pagetable.py 
      pagetable.py # visible 
      page.py # error 

pagingsimulation.py konnte Import Speicher/und instanziiert pagetable.PageTable, aber sobald ich page.py erstellt und hatte pagetable.py Import page.py, pagingsimulation. Py wirft nun diesen Fehler bei der Ausführung.

Traceback (most recent call last): 
    File "pagingsimulator.py", line 5, in <module> 
    import memory 
    File "src/memory/__init__.py", line 1, in <module> 
    from .pagetable import PageTable 
    File "src/memory/pagetable.py", line 1, in <module> 
    import page 
ImportError: No module named 'page' 

im Speicher/__ init__.py ich derzeit haben,

from .pagetable import PageTable 

... aber haben viele andere Variationen ohne Erfolg versucht.

Ich habe mehrere Ansätze ausprobiert und habe dies für eine Weile recherchiert und vielleicht ist es etwas, was ich an dieser Stelle nicht sehen kann. Was verhindert, dass sich meine benutzerdefinierten Module gegenseitig importieren, wenn sie von main() ausgeführt werden?

+0

Nach dem Verzeichnis-Layout an der Spitze, 'src' und' memory' sind Geschwisterverzeichnisse, aber die Traceback bezieht sich auf 'src/memory/...' –

+0

'importieren Seite' funktioniert nur, wenn das übergeordnete Verzeichnis ('project/src/memory') ist auf deinem' PYTHONPATH'. –

+0

@JohnGordon Das war ein Formatierungsfehler. Danke für den Fang. Speicher ist ein Unterverzeichnis zu src (d. h., project/src/memory / –

Antwort

0

Die Lösung, wie ich vermutete, war ein Pathing-Problem und genauer in Bezug darauf, wie die Module interagieren, sobald sie in die übergeordnete Datei pagingsimulation.py importiert wurden.

So, dieses Problem zu lösen, es hat nichts mit __init__.py zu tun hatte, sondern vielmehr, wie ich war page.py aus pagetable.py

So pagingsimulator.py Anwendungen zugreifen,

import memory 

Und innerhalb des Speichers, die init Py-Datei hat,

from .pagetable import PageTable 

Für Pagetable Seite zugreifen zu können, musste der Import-Anweisung sein,

from memory import Page 

Es scheint ein wenig zu mir funky und nach so vielen Versuchen ab ich sagen möchte ein sauberer Weg, dies zu tun ist, aber für den Augenblick werde ich meinen Gewinn und hoffen nehmen, dass diese verlassen Die Frage hier kommt einem anderen zugute, da ich während meiner Suche nichts Ähnliches finden konnte.