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
if __name__ == '__main__':
asd=asd()
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. –
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). –
Sie haben viel zu viele Dinge namens "asd" hier. –