Import-Fehler - no attribute - nach mv kein Fehler

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Habe jetzt keinen Nerv um diese Zeit noch ein ausführliches Statement abzugeben. Kurz und knapp: Es gibt einfach keinen Grund, dieses Verfahren überhaupt einzusetzen. Es gibt elegantere und sicherere Methoden, um Benutzereingaben als Code(-teile) verarbeiten.
Wenn man schon Erfahrungen mit Software Engineering gesammelt hat (beachte auch den Unterschied zwischen Programmieren und SE), WEIß man einfach auch, dass diese Methodik ein schlechter Stil ist, da gibt es eigentlich auch nicht viel zu erklären...
ttze
User
Beiträge: 9
Registriert: Montag 9. November 2009, 21:47

Und anstatt einfach kurz ein elegantes Stichwort zu nennen, macht man sich lieber die Mühe von oben herab den Oberlehrer zu spielen, ohne nähere Infos zum Code zu haben. Zwei, drei Stichworte hätten es ja auch getan, dann hätte ich nochmal lesen können und alles wären glücklich. Das wäre hilfreich gewesen. Vielleicht muss ich die Eingaben ja irgendwie ablegen, weil ich mit zwei verschiedenen Anwendungen arbeite und leider keine Objekte hin und her werfen kann? Vielleicht weiss ich ja auch, dass eval etc böse ist und mir entsprechend Gedanken dazu gemacht habe.

Aber schön das die Nerds so reagieren, wie man es von ihnen erwartet. Selbstgerecht und zynisch. Sobald jemand mal mit Nichtwissen glänzt wird drauf gehauen. Und dabei habe ich nciht mal eine doofe Frage gestellt. Hier wird unaufgefordert rumbelehrt. Echt unnötg sowas. Schade, die Anmeldung hat sich nicht gelohnt.
BlackJack

@ttze: Also wenn ich mir zu `eval()` Gedanken mache, und Quelltext erzeugen, in eine Datei schreiben, und dann importieren anschaue, dann sehe ich die *selben* Probleme wie bei `eval()` plus ein paar weiterer, die man sich auf diese Weise einhandelt. Dann doch lieber `compile()`, `eval()` und/oder ``exec``.

Nochmal zum Quelltext: Das öffnen mit 'w+' löscht den alten Dateiinhalt nicht, das heisst, wenn es die Datei schon gibt, und weniger geschrieben wird, als vorher drin war, dann steht nach den neuen Daten immer noch alter "Müll", der zu Problemen führen kann.

In der Funktion steht ja schon ``return a`` und beim Generieren des Modulinhaltes schreibst Du diese Zeile noch einmal extra dahinter!?

Das hart kodierte `/var/tmp/` macht den Quelltext ziemlich systemabhängig. Das Modul `tempfile` aus der Standardbibliothek kann helfen plattformunabhängig temporäre Dateien und Verzeichnisse zu finden bzw. zu erzeugen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

ttze hat geschrieben:Vielleicht muss ich die Eingaben ja irgendwie ablegen, weil ich mit zwei verschiedenen Anwendungen arbeite und leider keine Objekte hin und her werfen kann?
Warum soll IPC nicht gehen?
>> PIPES, Sockets, XML-RPC, SOAP, ..
(Ich versuche deine Kritik umzusetzen, hier hast du deine Stichworte ;) )

Außerdem müsstest bei deiner Lösung dem zweiten Prozess ja auch sagen, dass die Datei geschrieben ist.

Am besten beschreibst du auch mal deine konkreten Anforderungen, dann können wir dir bestimmt auch noch genauer helfen und dir entsprechende Stichworte geben. Bisher ist mir noch nicht ganz klar, was für Usereingaben du überhaupt hast und was für ein Code dabei herauskommen soll. Da müssen wir dann halt auch ein bisschen spekulieren und können nicht so konkret werden...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ttze hat geschrieben:Aber schön das die Nerds so reagieren, wie man es von ihnen erwartet. Selbstgerecht und zynisch. Sobald jemand mal mit Nichtwissen glänzt wird drauf gehauen.
Ich hocke halt nicht den ganzen Tag am Rechner, um auf Fragen zu antworten. Aber kauf doch Leonidas Premium, mit EMail und IRC-Support. Alternativ auch Leonidas Ultimate mit Telefonsupport. Spaß beseite...
ttze hat geschrieben:Und dabei habe ich nciht mal eine doofe Frage gestellt. Hier wird unaufgefordert rumbelehrt.
Ich hab halt nur nen Einwurf gemacht, weil ich nicht mehr Zeit hatte. Eine etwas ausfühlichere Erklrärung (ist auch schon spät, daher fasse ich mich kurz, ok?): Codegenerierung führt zu Code der schwer zu Debuggen ist und auch zu unnötiger Platten-IO. Außerdem wird durch das erstellen von Dateien und das laden dieser, der Code in Bytecode-kompiliert und nur einmal ausgeführt. Bei normalen Code wird einmal kompiliert und mehrmals ausgeführt, was ein wenig effizienter ist. Außerdem, stell dir vor, du arbeitest auf einem read-only-Dateiesystem oder einem wo du keine Schreibberechigungen hast. Oder das Dateisystem ist voll. Was dann? Das wäre ohne Codegenerierung nicht nötig, zudem es gerade in Python eigentlich immer elegantere und hübschere Lösungen gibt.
ttze hat geschrieben:Schade, die Anmeldung hat sich nicht gelohnt.
Du kannst von deinem 14-Tage Rücktrittsrecht Gebrauch machen und dein Geld zurückfordern. :P

Ich finds aber auch etwas seltsam dass sich niemand zu einer Erklärung erbarmt hat...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ttze
User
Beiträge: 9
Registriert: Montag 9. November 2009, 21:47

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. ;)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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. :)
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.

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.
ttze
User
Beiträge: 9
Registriert: Montag 9. November 2009, 21:47

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:)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

ttze hat geschrieben:Pyro schau ich mir aber nochmal an. Danke:)
Dazu reicht eigentlich fast ein Blick auf das Minimal-Beispiel:
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)
Antworten