compile()??

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pluto()

hallo,
mal wieder eine frage: Ich versuch rauszufinden, ob ein string gültiger python-code ist. Vermutlich kann man das wohl mit compile() -
z.B.

Code: Alles auswählen

compile("print('hi'),'',exec)
das problem ist nur, das ich da anscheinend das ganze gleich ausfuehren muss (oder aber, wenn ich eval statt exec setze, immer einen syntax error auf das obige print kriege)
Ich will aber ja nur wissen, ob man es ausfuehren _koennte_ wenn man denn wollte, am besten waere fast eine function, die entweder eine exception erzeugt oder den string einfach zurueckgibt. Gibt's sowas, bzw. wie kann man das machen?

Ich hab auch schon die codeop probiert, aber da scheint's genauso zu sein...

am ende soll dann, wenn's python ist, der string einfach in ein file geschrieben werden und wenn nicht muss ich ihn erst noch in python verwandeln... :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

hmm... ich weiß keine direkte oder elegante Lösung, ich versuchs aber mal.

mit execfile kann man eine ganze Datei ausführen, und da wird ein Fehler erzeugt, wenn etwas nicht "Pythontypisch" ist. Hat allerdings zwei große Nachteile:

1.) Es muss immer eine Datei erzeugt werden und alles hineingeschrieben werden vor dem Test.
2.) Die Datei wird auch wirklich ausgeführt, nicht bloß auf Ausführbarkeit getestet.

was anderes wüste ich nicht.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Also auf Anhieb fällt mir nur pychecker ein.

Was aber möchtest du testen, nur die Inlinefunktionen, sozusagen das "eigentliche" Python oder auch die Funktionen der dazugehöriger Module?

Hans
pluto()

Also das ganze soll einen mud-client geben, und dafuer will ich scripts parsen. Das waeren dann scripts, die einerseits simpel-python enthalten können und andererseits zeilen, die direkt ans mud geschickt werden. Egal, jedenfalls hab ich dann ein file das sowohl python- als auch nicht-python-zeilen enthaelt. Und da will ich eben wissen, was ist was.
Modules, naja, da werd ich wohl einige wenige einbeziehen, weiss aber noch nicht welche - auf jeden fall ist es erstmal ein festes set, also nicht das man etwa innerhalb dieses scripts noch was importen koennte...

Der Pychecker, hmtja wahrscheinlich kann man schon rausfinden wie der das macht wenn man das ganz durcharbeitet, so wie er ist hilft er mir glaub ich auch nicht wirklich...
pluto()

also um es noch was deutlicher zu machen:
Wenn dann in dem script-file irgendwas nicht-python gefunden wird, zB "palimpalim", dann soll das erstmal in python verwandelt werden, also etwa in engine.sendmud("palimpalim") und dann in dieser form wieder in das restlich script eingebaut werden.
Ganz so einfach, das man einfach alles substituten koennte, ist es dann aber wieder auch nicht, weil man muss noch variablen auswerten etc pp
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Hört sich eigentlich ein bisschen sehr kompliziert an. Aber kann man den pychecker nicht so einschränken, dass ausschließlich Fehler angezeigt werden, Dann weißt du schon einmal, ob's in Python ausführbar ist oder nicht.

Was ist eigentlich MUD? Bei www.whatis.com finde ich da Multi User Dungeon Das ist mir dann um diese Uhrzeit doch zu heftig.

Hans
pluto()

ja genau multi user dungeon stimmt - im grunde braucht man da nur einen besseren telnet-client, is also glaub ich gar nicht soooo kompliziert...

das das file als ganzes nicht ausführbar ist, weiss ich ja schon. Nagut, ich koennte vielleicht jeden string kurz als file auf die platte...:P Nee, werd mir den checker mal angucken vielleicht steckt da was drin...
pluto()

Die Frage ist uebrigens immer noch offen - hat keiner Lust eine zuendende idee zu haben wie man zB compile() davon abbringt, alles compilte gleich ausfuehren zu wollen? :)
Mickey
User
Beiträge: 22
Registriert: Donnerstag 29. August 2002, 00:34
Wohnort: Frankfurt am Main
Kontaktdaten:

Nun, zunächst solltest Du mal die Syntaxfehler entfernen, denn compile führt an sich nie Code sofort aus:

Ein

Code: Alles auswählen

compile("print('hi')",'',"exec")
funktioniert hier doch wie gewünscht, in dem Du ein Code-Objekt zurückgeliefert bekommst.

War es das, oder habe ich Dich falsch verstanden?
Gruß,

:M:
pluto()

Danke, Mickey,
Das hilft zwar insofern als dass der String nicht mehr ausgeführt wird, aber ob er nun gültiges Python oder bloss Bloedsinn war weiss ich immer noch nicht (zB gibt compile("proint('hi')",'',"exec") auch ein codeobject zurueck).
pluto()
Mickey
User
Beiträge: 22
Registriert: Donnerstag 29. August 2002, 00:34
Wohnort: Frankfurt am Main
Kontaktdaten:

Sagen wir mal so... Du bekommst damit alles heraus, was Du ohne den Code auszuführen überhaupt herausbekommen kannst. Also z.B. Syntaxfehler wie folgt:

Code: Alles auswählen

>>> c=compile("print (((","","exec")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1
    print (((
           ^
SyntaxError: unexpected EOF while parsing
Mehr geht nicht, ohne den Code wirklich auszuführen oder zu emulieren (also z.B. durch Introspektion des Byte-Codes... viel Spaß dabei :-D)
Gruß,

:M:
Antworten