Problem mit execfile() und import's...

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
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. September 2005, 09:49

Da das Problem von http://www.python-forum.de/viewtopic.php?p=23534#23534 ehr ein allgemeines mit execfile() ist, will ich es hier nochmal Schildern:

test.py

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import test2

print "Content-type: text/html; charset=utf-8\r\n"
print "test2.test:", test2.test
test2.py

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

test = "1"
test3.py

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

while 1:
    execfile( "test.py" )
    raw_input( "weiter..." )
So, also man ruft test3.py auf... Es wird test.py ausgeführt, welches die Variable aus test2.py anzeigt. Soweit so gut.
Nun gehen wir hin und ändern die Variable in test2.py auf einen anderen Wert (während die while-Schleife noch läuft!)... Drücken dann ENTER und sehen, das sie anscheinend noch nicht geändert wurde!

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. September 2005, 10:01

OK, erster Work-a-Round, ich nutzte kein execfile() sondern führe per subprocess den Python-Interpreter aus:

test3.py

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys, subprocess

while 1:
    process = subprocess.Popen(
            "%s %s" % ( sys.executable, "test.py" ),
            cwd     = ".",
            shell   = True,
            stdout  = subprocess.PIPE,
            stderr  = subprocess.PIPE
        )
        sys.stdout.write( p.stdout.read() )
        sys.stderr.write( p.stderr.read() ) 

    raw_input( "weiter..." )
Etwas aufwendig, aber es geht...
Zuletzt geändert von jens am Donnerstag 15. September 2005, 08:32, insgesamt 1-mal geändert.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Mittwoch 14. September 2005, 11:45

Das Problem hat mich auch mal ne Zeit lang geärgert (bei mod_python).
Die Module werden irgendwie gecachet, das kann man aber mit reload explizit umgehen:

(ungetestet)

test.py:

Code: Alles auswählen

import test2
reload(test2) # update modules contents

# ...
print test2.test
Aus performance-Gründen solltest du evtl. überlegen, ein DEBUG-Flag einzufügen (so dass er nur reloaded wenn der DEBUG-Modus läuft), oder nur in bestimmten Zeitabständen reload zu nutzen oder nur jeden x-ten Aufruf, oder oder oder....
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. September 2005, 11:47

Hm. Naja, eigentlich möchte ich keine änderungen an den CGI-Sourcen vornehmen. Da arbeite ich lieber mit dem subprocess-work-a-round...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Mittwoch 14. September 2005, 12:10

Muss es denn execfile sein? Sollte import + reload nicht dasselbe bewirken? (Wobei ich nicht weiß, ob die Module, die dann von den ausgeführten Files geladen werden auch mit reloaded werden)
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. September 2005, 13:05

Mit reload geht's nicht... Die "sub-module" werden nicht reloaded ;(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 14. September 2005, 15:39

Such mal im internet nach deep reload, das ist mir letztens über den Weg gelaufen und sollte das machen, was du willst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 14. September 2005, 15:46

Das liegt daran, dass die Dinger unter XXX.pyc gecacht werden. Und Execfile cacht anscheinend noch anderswo.
Hab ich auch schon bemerken müssen. Ich versuche wenn möglich execfile aus dem Weg zu gehen und __import__ zu verwenden.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. September 2005, 15:52

Hätte noch eine andere Idee...
Den Server nach jeder Abhandlung eines request neu starten... Also sys.exit() und per Batchdatei wird er wieder gestartet...

Aber das ist wohl weniger Praktikabel als die subprocess Variante...


EDIT: Das Problem hat sich erledigt, s. http://www.python-forum.de/viewtopic.php?p=23648#23648

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten