Seite 1 von 1

inspect.getsource updatet nicht, bei änderung der quelle

Verfasst: Sonntag 28. Oktober 2007, 19:32
von Jonathan_Josenhans
Hallo Leute,

ich schreibe gerade an einem Python-XSI-Script . Ich habe ein Modul mit meinen Basisfunktionen, und importiere dies in in mein (ganz normales pys) Script. Dann nutze ich die getsource() Funktion des inspect modules um eine Funktion meines Basismodules auszulesen.

Wenn ich jetzt das Basismodul ändere, und dann mein Script erneut ausführe, wird von getsource immernoch der alte Code ausgegeben. Dies passiert auch wenn ich das Basismodul mit reload() update.

Ich habe zwar einige Leute in verschiedenen Foren gefunden, die das gleiche Problem haben, aber keine Lösung.

Gibt es dafür inzwischen eine Lösung, die einer von Euch kennt? Das würde mir sehr helfen! Danke schon mal im Vorraus,
Jonathan

p.s.: Hier wird das gleiche Problem noch mal von jemand anderem beschrieben: http://mail.python.org/pipermail/python ... 29196.html

Verfasst: Sonntag 28. Oktober 2007, 19:54
von BlackJack
Versuch mal ob nach dem `reload()` ein `linecache.clearcache()` hilft.

Wozu brauchst Du den Quelltext innerhalb des Programms denn?

Verfasst: Montag 29. Oktober 2007, 04:36
von Jonathan_Josenhans
Vielen Dank, dass hat mein Problem gelöst! Jetzt muss ich nicht jedesmal das Programm schließen, und neu starten, wenn ich eine Änderung an dem Basismodul gemacht habe.

In XSI kann man Fenster erstellen, und dann eine Programmiersprache und den entsprechenden Quellcode als String zuweisen. Dafür brauche ich die Funktion als String. Dieser wird dann ausgeführt sobald das Fenster geöffnet wird oder eine der On_Event() Funktionen ausgelöst wird.

Da habe ich auch gleich noch mal eine kleine Frage: inspect.getsource(modulname.funktionsname) funktioniert einwandfrei bei mir. Wie kann ich aber eine Funktion, die sich im gleichen Modul/Script befindet auslesen? Denn inspect.getsource(funktionsname) für eine Funktion im gleichen Script funktioniert nicht. Wie ist da die korrekte Syntax?

Verfasst: Montag 29. Oktober 2007, 08:49
von BlackJack
Das sollte auch ohne Modulnamen funktionieren. Was passiert denn dann?

Verfasst: Montag 29. Oktober 2007, 09:06
von Jonathan_Josenhans
Hi BlackJack,

Wenn ich diesen Code ausführe:

Code: Alles auswählen

import inspect

def muliply(x):
	oResult = x*x
	return oResult

Application.Logmessage(inspect.getsource(muliply))
kriege ich folgende Fehlermeldung:

Code: Alles auswählen

# ERROR : Traceback (most recent call last):
#   File "<Script Block >", line 7, in ?
#     Application.Logmessage(inspect.getsource(muliply))
#   File "C:\Python24\lib\inspect.py", line 563, in getsource
#     lines, lnum = getsourcelines(object)
#   File "C:\Python24\lib\inspect.py", line 552, in getsourcelines
#     lines, lnum = findsource(object)
#   File "C:\Python24\lib\inspect.py", line 410, in findsource
#     raise IOError('could not get source code')
# IOError: could not get source code
#  - [line 7]
Application.Logmessage sind XSI spezifische befehle. Python(2.4) ist über die Active State - Python ActiveX Scripting Engine in XSI eingebunden.

Ich habe auch verschiedene Varianten von inspect.getsource probiert. Mal mit ...(Funktionname) dann mit ...(Funktionsname()). Dann habe ich auch das ganze mal als Modul gespeichert und dann das Modul in sich selbst importiert, und das Modulpräfix sowie den Funktionsnamen ...(Modulname.Funktionsnamen) versucht was auch nicht ging. Wenn ich das aber mit einem externen Modul mache, geht es.

Ich hoffe die Erklärung ist verständlich, vielen Dank für dein Hilfe!
Jonathan