2017-09-12 5 views
0

Hallo Ich bin neu in Python und denke, ich habe ein Problem mit der Programmstruktur, die ich gebaut habe.Hinweis auf Struktur zu lösen ImportErrors

Dies ist ein Auszug aus der Struktur, an die ich gedacht habe.

. 
└── asd 
    ├── asd.py 
    ├── __init__.py 
    ├── Framework 
    │   ├── importer.py 
    │   └── __init__.py 
    ├── Library 
    │   ├── libraryManager.py 
    │   └── __init__.py 

in Wirklichkeit gibt es viele weitere Pakete unter asd. asd.py soll das "Haupt" sein. Es instanziiert viele Objekte der verschiedenen Klassen, die in den anderen Paketen enthalten sind, beispielsweise hat es mehrere libraryManager-Objekte. Der Importeur kann (nicht nur) Bibliotheksdateien importieren.

Ich denke, mein Hauptfehler ist der folgende: Um die Klassen innerhalb der verschiedenen Pakete zu ermöglichen, auf andere Instanzen von asd zuzugreifen, erhalten sie einen Verweis auf die Haupt asd als Parameter. Das sind die Dateien in Frage:

asd.py:

from asd.Framework.importer import importer 
from asd.Library.libraryManager import libraryManager 
class asd(object): 

    def __init__(self): 
     # instantiate several objects 
     self.nodeLibMng = libraryManager("DbNodeLibrary.txt") 
     self.importer = importer(self) 

importer.py:

from asd.asd import asd 
class importer(object): 

    def __init__(self, asdRef : asd): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 

Nun, wenn ich die asd.py ich die folgende Fehlermeldung ausgeführt werden soll:

ImportError: No module named 'asd.Framework'; 'asd' is not a package 

Wenn ich einen Testcode innerhalb der importer.py I ausführen erhalten diese Fehlermeldung:

ImportError: cannot import name 'asd' 

andere Themen wie ImportError: Cannot import name X legen nahe, dass ich Kreis abhängige Importe haben.

Also wie kann ich das lösen, aber behalte das Verhalten, dass jede Klasse mit den Instanzen von asd kommunizieren kann?

EDIT 0: Ich fange die asd.py oder importer.py von

Zugabe
if __name__ == '__main__': 
    asd=asd() 
+1

Sie haben das 'asd' Verzeichnis auf Ihrem Weg, nicht das * übergeordnetes Verzeichnis * von' asd'. So wird 'asd.py' als ein Modul der obersten Ebene und nicht als das Verzeichnis gefunden. –

+0

Verwenden Sie 'asd.py' als Skript? Wenn ja, nicht. Sie können keine einzelne Datei in einem Paket als Skript ausführen, da dies sofort zu einem Verzeichnis der obersten Ebene auf dem Pfad wird. Setzen Sie Skripte * außerhalb * -Pakete oder verwenden Sie den Schalter 'python -m', um das Modul als Skript auszuführen (Pakete, die ein'__main___py'-Modul haben, können mit dieser Methode ausgeführt werden). –

+0

Sie haben viel zu viele Dinge namens "asd" hier. –

Antwort

0

Für alle, die das gleiche Problem haben: ich aufgegeben einfach die Spezifikation des Eingabetypen des Referenz und Vertrauens ich selbst und andere, um die richtige Referenz zu geben. Zusätzlich habe ich alle Zugriffe auf die Referenz in try: except: Blöcke gewickelt.

So im Beispiel oben:

class importer(object): 
    # compare to the previous def __init__(self, asdRef : asd): 
    def __init__(self, asdRef): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     try: 
      self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 
     except: 
      raise 
Verwandte Themen