[Python-de] Aktueller Pfad
Thomas Fanslau
tfanslau at gmx.de
Thu Jul 11 20:28:57 EDT 2002
Warum eigentlich drum herum reden: Das war eine dumm formulierte Frage,
weil ich eigentlich etwas was ganz anderes meinte, sorry (und danke ;-).
'sys.argv[0]' war mir schon bekannt, aber ich experimentierte gerade mit
´compile´ und 'InteractiveInterpreter' herum und habe dann was verwechselt.
Dafür habe ich jetzt ein anderes Problem in dem selben Bereich und hoffe
jemand kann mir helfen. Hier erstmal ein Schnipsel:
-------------8<----------------------------------------------------
import code
test = 2 # {1}
def printTest():
global test # {2}
print test
def testIP():
env = {"printTest" : printTest}
ip = code.InteractiveInterpreter(env)
f = r"""test = 1; printTest()"""
c = compile(f, '<string>', 'exec')
if c:
ip.runcode(c)
else:
raise SyntaxError, 'Code segment does not compile'
if __name__ == "__main__":
testIP()
------------->8----------------------------------------------------
'testIP' trägt die Funktion 'printTest' in ein Dictionary ein. Dabei
kann die Funktion eigentlich noch nicht übersetzt worden sein, denn wenn
ich die mit {1} und {2} markierten Zeilen entferne/auskommentiere gibt
es trotzdem keinen Fehler. Wird 'env' aber ausgegeben dann weiss Python
bereits, das es sich um eine Funktion handelt, hat also den Text geparst.
Ich lege einen neuen Interpreter an und übergebe das Dictionary. Nach
'code.py' sind das die neue 'locals'. Und das bestätigt sich auch
nachdem ich mit 'compile' übersetze und dann in dem neuen Interpreter
ausführe.
ABER obwohl die Funktion 'printTest' so weit übersetzt ist, das er merkt
das es eine Funktion ist und noch NICHT so weit übersetzt ist, das er
merkt, das er 'test' gar nicht kennt (wenn {1} und {2} entfernt sind),
also eigentlich erst beim Aufruf die Werte in den 'globals()'- und
'locals()'-Listen klar sind werden diese jetzt, beim Aufruf in dem neuen
Interpreter völlig ignoriert. Bzw. nur innerhalb von 'printTest'
ignoriert. Das macht doch irgendwie gar keinen Sinn.
Noch interessanter wird es, wenn die beiden Zeilen in dem Schnipsel
nicht gelöscht sind. Dann wird ein Wert ausgegeben. Überaschenderweise
aber eine '2', was heisst, das der neue Interpreter die globale Variable
aus einer völlig anderen Interpreterinstanz anpackt.
Aus Speichergesichtspunkten kann ich verstehen, das der neue Interpreter
oder besser, alle Interpreter in dieser Instanz von PYTHON sich ein
Fundament teilen. Das ist sicher auch die gemeinsame Speicherverwaltung.
Aber so ?!
Kann ich dieses Verhalten irgendwie steuern? Ich würde gerne dem zweiten
Interpreter einige Funktionen zur Verfügung stellen, die aber auch
gleichzeitig natürlich auf nur auf die Daten dieses Interpreters zu greifen.
--tf
Rainer Fischbach schrieb:
> sys.argv[0]
>
> ---------- Original Message ----------------------------------
> From: Thomas Fanslau <tfanslau at gmx.de>
> Reply-To: python-de at starship.python.net
> Date: Thu, 11 Jul 2002 15:33:53 +0200
>
>
>>Wie kann ich den Pfad eines laufenden Python-Skripts INNERHALB des
>>Skripts herausbekommen? Also wenn ich 'project\peterpan\script.py' von
>>ganz woanders her starte wüsste ich gerne den 'getcwd()' des Skripts und
>>nicht den an dem ich gerade bin ....
>>
>>--tf
>>
>>_______________________________________________
>>Python-de maillist - Python-de at starship.python.net
>>http://starship.python.net/mailman/listinfo/python-de
>>
>
>
> _______________________________________________
> Python-de maillist - Python-de at starship.python.net
> http://starship.python.net/mailman/listinfo/python-de
>
> .
>
More information about the Python-de
mailing list