erzeugen von .pyc

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
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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
be or not to be
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Macht er eigentlich auch. Arbeitest du zufaellig mit der IDLE?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

ja teils, teils idle + parallel auch einfach auf der shell...
öhm naja hier im büro auf der eingabebox (win)
be or not to be
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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...
be or not to be
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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!
be or not to be
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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".
Das Leben ist wie ein Tennisball.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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. :shock:

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:

Code: Alles auswählen


print parser.__subclasses__()

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 :twisted:

vg chris
be or not to be
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du auf der Konsole die Programme mit

Code: Alles auswählen

python dein_script.py
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.
Das Leben ist wie ein Tennisball.
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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
be or not to be
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Code: Alles auswählen

python mein_skript.py
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.
Das Leben ist wie ein Tennisball.
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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
be or not to be
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich würde mich micht auf ``%reset`` verlassen, denn der Interpreter selbst sieht keine Möglichkeit vor "zurückgesetzt" zu werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
maxwell
User
Beiträge: 69
Registriert: Samstag 11. Juli 2009, 15:36
Wohnort: am Fernsehturm in B.

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
be or not to be
Antworten