Okay. Sorry für meinen Ton - Abschlussarbeiten in der Endphase nerven.
@ ice2k3: Danke für die Links. Wieder etwas dazu gelernt.
Also ich versuche mal in 2-3 Sätzen zusammen zu fassen, was ich gemacht habe.
Es ist eine internetbasierte Anwendung geworden, bei dem verschiedene Themen aus Python3 behandelt werden, ähnlich zum Tutorial evtl. Soweit bin ich noch nicht, aber da steckt schon Wissen aus der Didaktik drin. Zu jeder dieser Einheiten, gibt es eine Aufgabenstellung, bei der der Benutzer irgendwas selber machen muss und die Anwendung das ganze auswertet.
Ich habe also einen Strauß voller Probleme: Django 2.6 <-> Anwendercode 3.x., Überhaupt der Anwendercode an sich, auf einem Server
Umsetzung bisher: Ich schreibe aus Django heraus den Code in ein File und habe in Python3 ein Tool, was das ganze auswertet. Dabei startet Django einen subprocess und wartet auf das Tool.
Erstmal versuche ich einen AST zu bilden, den ich wiederum nach unerlaubten builtins etc. durchsuche. (Ich hab hier schon gelesen, dass es da ganz fiese Möglichkeiten gibt, trotzdem Böse dinge zu tun)
Wenn der AST i.O. ist, dann versuche ich den Code auszuwerten. In dem Code vom Ausgangsposting geschieht das, durch Prüfen des Rückgabewertes. Aber ich merke, wenn da jemand return 45 schreibt, weil ich den AST nach Schlüsselwörtern durchsuche, wie "For" z.B.
Wenn das Auswerten fertig ist, wird ein XML-File zurück geschrieben, in dem die Fehler etc. drin stehen.
Das ist so ganz grob umrissen der jetzige Entwurf. Da stecken einige Probleme drin, aber dafür machen wir das ja, um so was zu lernen.
Und nicht wieder drauf hauen.
Import-Fehler - no attribute - nach mv kein Fehler
Diese Beschreibung hört sich so an, als würdest du NICHT das ``ast`` Modul verwenden, oder täusche ich mich da? Falls nicht, noch einmal der Hinweis auf meinen Funktionsparser, der enthält schon die Grundlagen für dein Vorhaben. Kann dir (wie gesagt) auch die neue Version geben, diese kann neben dem Evaluieren auch LaTeX-Strings der math. Funktion erstellen und enthält besseres Exception-Handling, außerdem habe ich noch eine Test-Klasse dazu.ttze hat geschrieben:Erstmal versuche ich einen AST zu bilden, den ich wiederum nach unerlaubten builtins etc. durchsuche. (Ich hab hier schon gelesen, dass es da ganz fiese Möglichkeiten gibt, trotzdem Böse dinge zu tun)
Wenn der AST i.O. ist, dann versuche ich den Code auszuwerten. In dem Code vom Ausgangsposting geschieht das, durch Prüfen des Rückgabewertes. Aber ich merke, wenn da jemand return 45 schreibt, weil ich den AST nach Schlüsselwörtern durchsuche, wie "For" z.B.
Wie schon angedeutet würde ich in dem Fall folgenden Weg gehen:
Benutzereingabe (Django 2.6) --> IPC --> Evaluieren der Eingabe mit ``ast`` (Python 3).
Sehr komfortabel für IPC unter Python finde ich außerdem das Modul "Pyro" (Python Remote Objects - http://pyro.sourceforge.net/ ). Weiß allerdings nicht mit welchen Python-Versionen das kompatibel ist, auf der Seite findet sich auf den ersten Blick leider auch nichts. Von mir persönlich unter 2.3 und 2.6 erfolgreich getestet.
Danke für dein Angebot, darauf komme ich evtl zurück. Allerdings ist bald Abgabe und von daher ist der point-of-no-return schon überschritten.
Doch doch, ich benutze das Modul ast. Zum einen um diesem mit eine Vistor nach unerwünschten Nodes zu durchsuchen und andererseits um an die einzelnen Elemente heranzukommen, um diese zu evaluieren. Wenn der Code allerdings nicht in einen AST überführt werden, weil ein compile() einen Syntaxfehler wirft, muss ich derzeit per Hand ran und die Fehler analysieren. Ein vergessener ":" z.B. ist kein Problem.
Pyro schau ich mir aber nochmal an. Danke:)
Doch doch, ich benutze das Modul ast. Zum einen um diesem mit eine Vistor nach unerwünschten Nodes zu durchsuchen und andererseits um an die einzelnen Elemente heranzukommen, um diese zu evaluieren. Wenn der Code allerdings nicht in einen AST überführt werden, weil ein compile() einen Syntaxfehler wirft, muss ich derzeit per Hand ran und die Fehler analysieren. Ein vergessener ":" z.B. ist kein Problem.
Pyro schau ich mir aber nochmal an. Danke:)
Dazu reicht eigentlich fast ein Blick auf das Minimal-Beispiel:ttze hat geschrieben:Pyro schau ich mir aber nochmal an. Danke:)
http://pyro.sourceforge.net/manual/8-example.html
Da siehst du auch, dass das wirklich sehr schnell umgesetzt ist
(Pyro braucht außerdem nicht installiert werden, wenn du den Ordner zu deinem Modul packst, funktioniert das auch)