Seite 1 von 1

[ImportError] Unter-Module die sich gegenseitig importieren

Verfasst: Mittwoch 16. August 2006, 10:57
von Blue-Tiger
Hi there! Ich hab ein kleines Problem, ich hoff ihr koennt mir vielleicht weiterhelfen. Google spuckt nicht wirklich was aus (bzw. viel zu viel), wenn ich da nach "ImportError" such.

Anyway, folgendes Problem:

In meinem Programm (searchDoubles) gibt es mehrere Packages: 'gui' (mit dem Modul 'TkGui.py'), 'filetypes' und 'util' (mit den Modulen 'main.py' und 'SimilarityList.py').
Ausserdem gibts im Hauptverzeichnis ein Hauptscript, "searchDoubles.py".

aus searchDoubles.py:

Code: Alles auswählen

from gui import TkGui as Gui
from util import SimilarityList
from filetypes import *

aus gui/TkGui.py:

Code: Alles auswählen


import tkFileDialog
from Tix import *
from searchDoubles.src.util import main
Beim Ausfuehren von searchDoubles.py erhalte ich immer folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\tmp\searchDoubles\src\searchDoubles.py", line 34, in ?
    from gui import TkGui as Gui
  File "C:\tmp\searchDoubles\src\gui\TkGui.py", line 4, in ?
    from searchDoubles.src.util import main
  File "C:\tmp\searchDoubles\src\searchDoubles.py", line 34, in ?
    from gui import TkGui as Gui
ImportError: cannot import name TkGui
Kann mir irgendwer weiterhelfen?

Verfasst: Mittwoch 16. August 2006, 11:23
von jens
Kannst du denn überhaupt ein "from gui import TkGui as Gui" machen???

Verfasst: Mittwoch 16. August 2006, 12:18
von Blue-Tiger
ja, denn wenn ich in gui/TkGui.py das "from searchDoubles.src.util import main" auskommentiere, funktioniert der Code: die GUI wird korrekt initialisiert und startet, nur bekomm ich spaeter logisch Fehler der Art "NameError: global name 'main' is not defined" innerhalb der GUI-Eventhandler (die eben den Zugriff auf das Modul util.main benoetigen).

Verfasst: Mittwoch 16. August 2006, 12:23
von birkenfeld
Im Prinzip kannst du das Problem vermeiden, indem du einen der zirkulären Importe in die Methode(n) verschiebst, in der die Importe benötigt werden.

Besser ist es aber, solche zirkulären Abhängigkeiten von vornherein aufzulösen, indem man z.B. ein gemeinsames drittes Modul erstellt.

Verfasst: Mittwoch 16. August 2006, 12:53
von BlackJack
So wie es dort steht muss `searchDoubles` auch ein Package sein, sonst dürfte es nicht gehen. Kannst Du mal die komplette Vereichnisstruktur mit Dateien posten?

Verfasst: Mittwoch 16. August 2006, 12:54
von Blue-Tiger
birkenfeld hat geschrieben:Im Prinzip kannst du das Problem vermeiden, indem du einen der zirkulären Importe in die Methode(n) verschiebst, in der die Importe benötigt werden.

Besser ist es aber, solche zirkulären Abhängigkeiten von vornherein aufzulösen, indem man z.B. ein gemeinsames drittes Modul erstellt.
Was fuer zirkulaere Importe? :?:

Verfasst: Mittwoch 16. August 2006, 13:02
von Blue-Tiger
BlackJack hat geschrieben:So wie es dort steht muss `searchDoubles` auch ein Package sein, sonst dürfte es nicht gehen. Kannst Du mal die komplette Vereichnisstruktur mit Dateien posten?
"als ich in gui/TkGui.py noch stehen hatte "from src.util import functions" bekam ich folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\tmp\searchDoubles\src\searchDoubles.py", line 34, in ?
    from gui import TkGui as Gui
  File "C:\tmp\searchDoubles\src\gui\TkGui.py", line 4, in ?
    from src.util import functions
ImportError: No module named src.util
Deswegen hab ichs mit "searchDouble.src.util" versucht.
"main.py" hab ich mittlerweile uebrigens in "functions.py" umbenannt, nur damit ihr euch nicht wundert.


Hier die Verzeichnisstruktur:

Code: Alles auswählen

[searchDoubles]
  license.txt
  searchDoubles.py

  [filetypes]
     File.py
     Mp3File.py
     OggFile.py
     __init__.py
     [helper]
         id3reader.py
         __init__.py

   [gui]
      TkGui.py
      wxGui.py
      __init__.py

   [util]
     functions.py
      SimilarityList.py
      __init__.py

Verfasst: Mittwoch 16. August 2006, 13:11
von Blue-Tiger
Ok, Problem erledigt, ich haette "from util include functions" schreiben sollen =) :oops:

Danke an alle fuer ihre Posts & die Hilfsbereitschaft, ich stell mich jetzt in die Ecke und schaem mich ;)