Seite 1 von 1
Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 12:38
von api
Hallo zusammen,
eventuell ne ganz einfache Frage (bzw. Antwort). Ich habe folgenden Programmcode:
Code: Alles auswählen
import os
test = 'os.path.join("/tmp", "test")'
print test
Die Ausgabe zur Zeit ist:
os.path.join("/tmp", "test")
Ist ja auch verständlich. Wie aber kann ich den Code in der Variablen ausführen? Also, dass das Ergebnis dann so aussieht?
/tmp/test
CU,
API
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 12:48
von cofi
Nun, `eval` tut das.
Die Sicherheitsaspekte sollten dir aber klar sein, eine sichere Version laesst sich ueber `ast` bauen.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 12:53
von Hyperion
Wobei Du uns durchaus mal genauer erläutern solltest, was Du da genau planst. Evtl. gibt es da ja auch einen anderen Weg.
Von eval() ist grundsätzlich abzuraten.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 12:56
von api
Hallo cofi,
danke für die schnelle Antwort - das ist das, was ich suchte...
Aber kannst du mir kurz dein Statement zu 'ast' erklären? Was ist an der obigen Anweisung nicht sicher?
Hyperion: Ich lese aus einer config.ini einen Pfad ein - also diesen String - und möchte ihn im Prg nun nutzen, natürlich als Datei-Pfad.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:05
von Barabbas
*g da ist dir ein kleiner Fehler unterlaufen:
Es muss heißen:
Code: Alles auswählen
import os
test = os.path.join("/tmp", "test")
print test
Funktionen sollten niemals in Anführungsstrichen stehen - sonst erhälst du einfach nur einen String, ohne dass irgendwas getan wird.
Gruß,
brb
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:06
von Hyperion
api hat geschrieben:
Hyperion: Ich lese aus einer config.ini einen Pfad ein - also diesen String - und möchte ihn im Prg nun nutzen, natürlich als Datei-Pfad.
Das Scenario birgt jede Menge Gefahren in sich... stell Dir vor da schreibt einer ein Python-Script in die Datei, die schlimme Dinge anstellt (Dateien löschen, usw) Das eval() würde das einfach ausführen.
Ich kapiere da noch nicht, was Du da eigentlich vor hast. Wieso musst Du da ein Python-Statement als String ablegen? Da müßtest Du doch noch mal ein wenig deutlicher werden.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:06
von lunar
@api: Denk doch nach. Man kann dann
jede beliebige Anweisung in diese Datei schreiben, Dein Programm wird sie anstandslos ausführen ... die daraus resultierenden Probleme sind doch eigentlich offensichtlich, oder?
Wieso muss der Nutzer überhaupt Quelltext eingeben, um einen Pfad in die Konfigurationsdatei einzutragen? Er kann doch einfach direkt den richtigen Pfad hinschreiben ...
@Barabbas: Das war ein
Beispiel 
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:07
von cofi
api hat geschrieben:Aber kannst du mir kurz dein Statement zu 'ast' erklären? Was ist an der obigen Anweisung nicht sicher?
`eval` wertet beliebigen Code aus, gerade bei deinem Anwendungsfall ist das mit Vorsicht zu geniessen, evtl sind 2 Variablen besser: eine fuer den Basisordner und eine fuer die Datei.
Zu ast:
http://docs.python.org/library/ast.html
Die Forensuche ist da auch hilfreich, AFAIR hatte sma schon mal ein Beispiel gepostet.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:08
von BlackJack
@api: Warum steht in einer Konfigurationsdatei diese Zeichenkette bei einer Pfadangabe? Warum steht da nicht gleich '/tmp/test' drin? Entweder Du hast eine Konfigurationsdatei im Ini-Format, oder Du legst Deine Konfiguration als Python-Modul an, das man dann einfach importieren kann. Mischen von beidem ist keine gute Idee.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:32
von api
Hallo zusammen,
ich habe vor, wiederkehrende Angaben (also von mehreren Programmen genutzt) in ein ini-File auszulagern, dass dann wie folgt aussieht:
Code: Alles auswählen
.
.
[FILES]
prot_file=os.path.join(LOG_DIR, ProgramName[0] + ".prot")
.
.
Das dann per ConfigParser ausgelesen - hätte ich das Protokoll-File. Brauch das also nicht immer bei jedem Prg neu zu schreiben.
Zu der Frage, warum ich nicht den Pfad hardcoded reinschreibe? Das LOG_DIR kann durchaus unterschiedlich sein - ganz zu schweigen vom Programmnamen.
Zugriff auf diese Datei hat kein User, der nicht weiss, was er da tut (so die Theorie!

)
Ansonsten gebe ich euch natürlich recht, einfach Programmcode auszuführen, ohne zu wissen, was drinsteht, wäre ein bischen arg gefährlich.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 13:53
von BlackJack
@api: Das ist aber IMHO noch kein Grund da ausführbaren Python-Quelltext als Wert hineinzuschreiben. Man könnte auch einfach Platzhalter definieren, die dann zum Beispiel mittels `string.Template` ersetzt werden.
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 14:36
von Barabbas
lunar hat geschrieben:@Barabbas: Das war ein
Beispiel 
*räusperhust* ups - weiß auch nicht, welche Synapsen da gerade bei mir verklebt waren /:
Re: Variableninhalt ausführen
Verfasst: Dienstag 7. September 2010, 17:04
von api
@BlackJack: Ich hab mich mal mit dem string.Template beschäftigt. Ob ich es so einsetze, kann ich im Augenblick noch nicht abschätzen - aber ein guter Ansatz...
Auf jeden Fall nehme ich Abstand von 'eval()' - eher werde ich eine Art einer Ersetzung wählen.
Danke euch für eure Hilfe.
Re: Variableninhalt ausführen
Verfasst: Mittwoch 8. September 2010, 09:28
von b.esser-wisser
Für ini-style Dateien gibts doch das
ConfigParser-Modul, das kann doch sowieso Platzhalter verwenden (Mit der alten "%(
name)
s"-Syntax).
hth, Jörg