Programm terminiert am Klassenanfang und anderes komisches

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Hallo Pythons,

ich habe zwei etwas konfuse Probleme nach dem Motto: Ich hab nix gemacht, aber jetzt geht nix mehr!

Ich baue an einem etwas komplexeren Programm, nutze Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08 ) und als Entwicklungssystem Eclipse 3.0 unter Windows XP. Der Quellcode ist auf mehrere Verzeichnisse und Module aufgeteilt.

Problem 1:

Es gibt eine Datei drivers/mailbox/Mailbox.py. Aus einer anderen Datei heraus soll sie importiert werden (die Autovervollständigung hat beim Tippen funktioniert!):

Code: Alles auswählen

from drivers.mailbox.Mailbox import *
Bis vor kurzem hat das auch funktioniert, jetzt bekomme ich im Konsolenfenster die Meldung:

Code: Alles auswählen

  File "D:\Workspace\FunctionalUnitTest\drivers\stub\StubDriver.py", line 12, in <module>
    from drivers.mailbox.Mailbox import *
ImportError: No module named mailbox.Mailbox
Das passiert auch mit einigen anderen Dateien, längst nicht mit allen. Wie gesagt, bisher hat es geklappt und die Dateien existieren auch.

Bei der Suche (dem Stochern :() nach der Ursache trat

Problem 2

zu Tage:

Nach mehreren Includes in einer Datei beginnt die Klassendefinition. Und genau auf der Zeile terminiert das Programm (plötzlich, wie gesagt, es lief ja bis vor einer Stunde):

Code: Alles auswählen

from utils.DllLoader import *

from logger.Logger import *

#------------------------------------------------------------------------------
## Stub-Treiber Klasse.
class StubDriver( Driver): #<-- hier stirbt das Programm....

    # -------------------------------------------------------------------------
    # statische Variablen
    __dllLoaded = False

Die Geschichten hören sich sehr nach Bit-rot an, ich habe keine Vorstellung, was ich getan habe, damit diese Phänomene auftreten, aber irgendwas muß ich ja getan haben.

Gibt es Beschränkungen bei der Anzahl der imports?
Sind rekursive imports ein Problem (wenn ja, wie verhindert man sie)?
Ich sehe gerade: Python kennt auch eine Mailbox, gehört das zu meinem Problem?

Ich wäre froh, wenn jemand von Euch etwas Licht in diese Dunkelheit brächte.

Gruß und Danke,

Christoph
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Nachschlag:

Die Geschichte mit den nicht gefundenen Modulen passiert an unterschiedlichen Stellen, je nach dem, ob ich die Sache im Debugger starte oder nicht...

Gruß,

Christoph
BlackJack

Beschreib mal genauer was "Hier stirbt das Programm" bedeutet.

Ansonsten ist natürlich auch immer die Frage von wo aus das Programm gestartet wird, also welches das aktuelle Arbeitsverzeichnis ist.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

BlackJack hat geschrieben:Beschreib mal genauer was "Hier stirbt das Programm" bedeutet.

Ansonsten ist natürlich auch immer die Frage von wo aus das Programm gestartet wird, also welches das aktuelle Arbeitsverzeichnis ist.
Moin,

sterben heißt sterben, also abbrechen. In der Console von Eclipse steht (oben im Rahmen) irgendwas von "terminated" und dann der Klassenname, mehr nicht. Kein Stack, keine weitere Information.

Aber im Moment ist das Problem mit den nicht gefundenen Modulen akut. Das mit dem Arbeitsverzeichnis werde ich mal prüfen, allerdings ist es so, daß es ja schon mal lief und sich an der Struktur nichts geändert hat, es sei denn, daß SVN irgendwelche Spielchen treibt...

Danke erstmal für den Hinweis,

Christoph
BlackJack

Arbeite doch mal von der Konsole, also starte den ganzen Kram per Hand und nicht über Eclipse. Dann kann man schon einmal eingrenzen ob das Problem bei Python oder bei Eclipse liegt.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

So, ich habe es mal auf der Konsole ausprobiert, das Ergebnis ist, daß wieder etwas vorhandenes nicht gefunden wird.

Die Mainroutine, die ich starten möchte, befindet sich in

D:\Workspace\FunctionalUnitTest\converter\tests\Test_StubApi.py

Als Basisverzeichnis dient FunctionalUnitTest.

Code: Alles auswählen

D:\Workspace\FunctionalUnitTest>dir converter\tests

 Verzeichnis von D:\Workspace\FunctionalUnitTest\converter\tests

18.07.2007  15:49               614 ConverterTestCase.py
19.07.2007  17:11             1.112 ConverterTestCase.pyc
14.08.2007  13:21             9.353 Test_9300Api.py
14.08.2007  17:05             4.778 Test_9300Api.pyc
23.08.2007  09:54             4.208 Test_StubApi.py
22.08.2007  13:51             1.272 __init__.py
22.08.2007  14:17             1.339 __init__.pyc
Nun starte ich das ganze mal:

Code: Alles auswählen

D:\Workspace\FunctionalUnitTest>python converter\tests\Test_StubApi.py
Traceback (most recent call last):
  File "converter\tests\Test_StubApi.py", line 13, in <module>
    from converter.ConverterControl import *
  File "D:\Workspace\FunctionalUnitTest\converter\ConverterControl.py", line 6, in <module>
    from config.ConverterConfig import *
  File "D:\Workspace\FunctionalUnitTest\config\ConverterConfig.py", line 5, in <module>
    from converter.devices.servo.9300 import *
  File "D:\Workspace\FunctionalUnitTest\converter\devices\servo\9300.py", line 14, in <module>
    from drivers.BusAdapter import *
  File "D:\Workspace\FunctionalUnitTest\drivers\BusAdapter.py", line 5, in <module>
    from drivers.mailbox.Mailbox import *
ImportError: No module named mailbox.Mailbox
Das Ergebnis ist, daß ein Modul nicht gefunden wird, obwohl die Autovervollständigung es kennt und die Datei mailbox.py vorhanden ist:

Code: Alles auswählen

D:\Workspace\FunctionalUnitTest>dir drivers\mailbox

 Verzeichnis von D:\Workspace\FunctionalUnitTest\drivers\mailbox

22.08.2007  13:06    <DIR>          .
22.08.2007  13:06    <DIR>          ..
22.08.2007  15:55             1.212 Mailbox.py
22.08.2007  12:01             1.182 MbxDataObj.py
22.08.2007  15:55             3.024 MbxRdSlot.py
22.08.2007  15:55             1.355 MbxSlot.py
22.08.2007  15:55             2.591 MbxWrSlot.py

Das gleiche passiert, wenn ich mich zum Startzeitpunkt im Verzeichnis

D:\Workspace\FunctionalUnitTest\converter\tests

befinde. Hat irgendjemand eine Idee, wie ich weitermachen kann?

Gruß,

Christoph
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Komme mir vor, wie ein Spammer...

Also, wenn ich die Dateien aus dem Vereichnis "mailbox" in das übergeordnete Verzeichnis schiebe, dann funktioniert es auf der Konsole und in Eclipse. Man könnte denken, daß es daran liegt, daß Python schon ein Modul "mailbox" hat, ich werde das Modul also auf jeden Fall umbenennen.

ABER:

Im Eclipse Debugger läuft es immer noch nicht! Da wird ein anderes Modul nicht gefunden, das ebenso vorhanden ist. Die Sache bleibt also misteriös...


Gruß,

Christoph
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Im Ordner Mailbox fehlt die ``__init__.py``, ohne die ist es kein Package.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Leonidas hat geschrieben:Im Ordner Mailbox fehlt die ``__init__.py``, ohne die ist es kein Package.
Prima, danke. Das löst das eine Problem. Trotzdem besteht es weiter, weil ein anderes Modul nicht gefunden wird.

Das scheint jetzt allerdings ein Eclipse Problem zu sein, dazu mache ich mal einen eigenen Thread auf, um die Übersichtlichkeit wieder herzustellen.

Ich danke Euch für's Lesen und Antworten!

Gruß,

Christoph
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Ok, nun hat sich das andere Problem auch erledigt. Die Importanweisung muß vollständig sein. Irgendwie war ich der Meinung, daß Module / Klassen / Dateien (ich bin mir bei der richtigen Bezeichnung dafür nicht sicher, Pythonanfänger :oops: ) einfach nur mit dem Modulnamen importiert werden können, wenn die beteiligten Dateien im selben Verzeichnis liegen. Im Runmodus klappt das offenbar, der Debugger ist da wohl etwas sensibel und möchte den ganzen Pfad haben.

Offensichtlich hat sich die entsprechende Anweisung entgegen meinen Behauptungen doch "heimlich" in den Code geschlichen. Wie es eben immer so ist, bin ja nicht der einzige, der daran arbeitet...

Nochmals danke an alle Leser und Helfer!

Christoph
Antworten