Seite 1 von 1

compile()??

Verfasst: Dienstag 7. Januar 2003, 21:28
von 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... :)

Verfasst: Dienstag 7. Januar 2003, 21:45
von Milan
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.

Verfasst: Dienstag 7. Januar 2003, 22:56
von hans
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

Verfasst: Dienstag 7. Januar 2003, 23:57
von 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...

Verfasst: Mittwoch 8. Januar 2003, 00:03
von 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

Verfasst: Mittwoch 8. Januar 2003, 00:23
von hans
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

Verfasst: Mittwoch 8. Januar 2003, 06:58
von 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...

Verfasst: Samstag 11. Januar 2003, 00:03
von 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? :)

Syntaxfehler im Beispiel

Verfasst: Sonntag 19. Januar 2003, 01:23
von Mickey
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?

Verfasst: Sonntag 19. Januar 2003, 12:43
von 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()

Mehr ist nicht drin

Verfasst: Mittwoch 29. Januar 2003, 01:09
von Mickey
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)