Seite 1 von 1

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

Verfasst: Mittwoch 14. September 2005, 09:49
von jens
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!

Verfasst: Mittwoch 14. September 2005, 10:01
von jens
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...

Verfasst: Mittwoch 14. September 2005, 11:45
von henning
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....

Verfasst: Mittwoch 14. September 2005, 11:47
von jens
Hm. Naja, eigentlich möchte ich keine änderungen an den CGI-Sourcen vornehmen. Da arbeite ich lieber mit dem subprocess-work-a-round...

Verfasst: Mittwoch 14. September 2005, 12:10
von henning
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)

Verfasst: Mittwoch 14. September 2005, 13:05
von jens
Mit reload geht's nicht... Die "sub-module" werden nicht reloaded ;(

Verfasst: Mittwoch 14. September 2005, 15:39
von Leonidas
Such mal im internet nach deep reload, das ist mir letztens über den Weg gelaufen und sollte das machen, was du willst.

Verfasst: Mittwoch 14. September 2005, 15:46
von mitsuhiko
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.

Verfasst: Mittwoch 14. September 2005, 15:52
von jens
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