Seite 1 von 1
erzeugen von .pyc
Verfasst: Dienstag 4. August 2009, 10:08
von maxwell
hallo forum,
ich habe hier folgendes phänomen. ich programmiere ein kleines modul. in meinem modul existieren klassen. in einem test-skript importiere ich dieses modul und veruche die klasse zu instanzieren. er sagt jedoch, dass diese klasse (oder modulattribute) nicht existiert. kann aber nicht sein, andere klassen die zuvor schon hinzugefügt wurden existieren auch.
kann mir hier jemand weiterhelfen. dachte immer der interpreter händelt das eigenständig sobald sich der quellcode ändert.
viele grüße
chris
Verfasst: Dienstag 4. August 2009, 10:11
von Rebecca
Macht er eigentlich auch. Arbeitest du zufaellig mit der IDLE?
Verfasst: Dienstag 4. August 2009, 10:15
von maxwell
ja teils, teils idle + parallel auch einfach auf der shell...
öhm naja hier im büro auf der eingabebox (win)
Verfasst: Dienstag 4. August 2009, 10:19
von maxwell
das ist doch nen witz..
jetzt sagt er mir auf der "shell" kann attribute nicht finden. auf der idle mit "execfile('path')" alles in ordnung und führt den code aus...
Verfasst: Dienstag 4. August 2009, 11:28
von maxwell
jetzt wird immer schrecklicher...
jetzt kennt er zumindest die klassenfunktion. anschließend ändere ich etwas am code und er gibt mir wieder nur den alten wert zurück!
Verfasst: Dienstag 4. August 2009, 11:36
von EyDu
Das passiert, wenn man mit IDLE oder dem interaktiven Interpreter entwickelt. Wenn du Änderungen an einem zu importierenden Modul machst, dann musst du die Module nach jeder Änderung mit "reload" neu laden. Starte daher deine Programm am besten gleich mit "python dein_programm.py".
Verfasst: Dienstag 4. August 2009, 11:40
von Rebecca
Wenn du von Shell redest, meinst du die IDLE-Shell oder den interaktiven Python-Modus (also das Ding in der schwarzen DOS-Box?). Ich wuerde dir mal vorschlagen, komplett auf die IDLE und deren Shell zu verzichten.
Ausserdem auf execfile, ich bin mir nicht sicher, ob es Module neu laedt. Ruf einfach dein Script aus der DOS-Box mit python myscript.py auf.
Verfasst: Dienstag 4. August 2009, 15:45
von maxwell
hallo und erstmal dank efür feedback,
ich habe folgendes gemacht.
in der IDLE (also interaktiver Modus) mit "execfile()" gearbeitet. zusätzlich auch ein ein "reload(modulename)". damit klappt das auch. nur kann ich doch nicht jedes modul neu laden.
auf der anderen seite nutze ich die "normale" DOS box. aufruf des interpreten mit
python meinscriptname.py
im jeweiligen verzeichnis. er macht es auch hier nicht. ich meine die aktualisierungen ohne einen reload()...
das ist echt zu mäuse melken.
ich schraube hier gerade an einem kleinen plugin-system. das witzige ist auch - passt grad in diesem zusammenhang - das er folgendes macht:
Code: Alles auswählen
def __findEngineParsers(self):
"""
collect all engine parsers which are arranged in parsers directory;
inspect
"""
collection = os.listdir(self.__pa_local) # __pa_local = pfad zu den parsermodulen
self.__initEngineParsers(collection)
def __initEngineParsers(self, parsers = []):
"""
adds the engine parsers which was founded in parsers
directory
"""
for parser in parsers:
__import__(parser, None, None, [])
ich erzeuge einfach nur eine liste mit den namen der module (parser) die eingebunden werden sollen. anschließend importiere ich sie und instanziere sie. alle parser erben von einer basisklasse mit den namen "parser" die im selben modul liegt.
anschließend gehe ich mit ran:
was passiert? er gibt mir ein einziges mal eine liste zurück und zwar genau dann wenn ich die idle neu starte.
ich hab heut echt nen brett vorm kopf
vg chris
Verfasst: Dienstag 4. August 2009, 16:05
von EyDu
Wenn du auf der Konsole die Programme mit
startest, dann hast du gar keine Möglichkeit "reload" per Hand aufzurufen. Außer du machst ganz seltsame Dinge. Läuft das Programm vielleicht noch, während du die Änderung machst? Die werden nämlich erst nach einem erneuten Start auch aufgenommen.
Verfasst: Mittwoch 5. August 2009, 09:16
von maxwell
jetzt mal langsam. irgendwie komme ich nicht mit.
ich mache nichts weiter als folgenden.
1.) ipython shell starten.
2.) execfile('meinskript.py')
3.) ausgabe erfolgt
iPython shell bleibt offen, und ich ändere mein skript. anschließend gleiches verfahren wie oben beschrieben. außer ipython neu starten, denn die ist ja schon geöffnet. solls jetzt daran liegen ? muss ich jedes mal den interpreten neu starten? wie soll ich dann entwickeln?
andere möglichkeit war ja eben über den befehl
python mein_skript.py
auf der einfachen dos eingabebox zu gehen. das dann kein reload erfolgt ist mir klar! den brauch ich ja hier nicht, da das programm ja nur einmal ausgeführt wird. das programm ist auch kein persistentes, also abbruch über key input.
wird denn python nach einem
python mein_skript.py
nicht beendet?
vg chris
Verfasst: Mittwoch 5. August 2009, 09:55
von EyDu
Ja, es liegt daran, dass du den ersten Schritt beim erneuten laden übergehst. Im interaktiven Interpreter bleiben alle Name erhalten und geladene Module werden nicht noch einmal geladen.
Mit
wird der Interpreter jedes Mal neu gestartet und alle Module neu geladen. Daher sollte es damit auch funktionieren. Kopiere sonst mal die Ausgaben vom Start des Scripts bis zu dessen Ende.
Verfasst: Mittwoch 5. August 2009, 12:03
von maxwell
faszinierend...
in der ipython shell funzt das programm (auch nach neustart) aber auf der dos eingabebox (python meinskript.py) nicht! es wird immer wirrer!
man kann übrigens mit
%reset
auf der ipython shell die namespaces killen!
damit funzt wenigstens das reloaden auf global.
danke für eure beiträge zur problem beseitigung.
vg chris
Verfasst: Mittwoch 5. August 2009, 19:02
von Leonidas
Ich würde mich micht auf ``%reset`` verlassen, denn der Interpreter selbst sieht keine Möglichkeit vor "zurückgesetzt" zu werden.
Verfasst: Dienstag 11. August 2009, 12:09
von maxwell
moin moin...
jepp nach langem suchen kann ich sagen warum es immer zu einem derartigen verhalten kam. es lag schlicht weg eine "alte" kopie in einem verzeichnis in dem auch meine aufgerufene "test-datei" lag...
toll 2 tage habe ich gesucht! aber wir üben ja noch!
*lol
grüße chris