[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