2 Stimmen

Aufruf von python aus python - Persistenz von Modulimporten?

Ich habe also einige Python-Skripte, und ich habe einen BaseHTTPServer, um ihre Antworten auszuliefern. Wenn die angeforderte Datei eine .py-Datei ist, führe ich das Skript mit execfile(script.py) aus.

Die Frage ist: Gibt es besondere Vorschriften für Einfuhren? Ein Skript muss nur einmal ausgeführt werden, und es wäre gut, wenn die Objekte, die es erstellt, zwischen den Anfragen am Leben bleiben. Kann ich darauf vertrauen, dass dies geschieht?

Läuft ein Skript, das über execfile() ausgeführt wird, anders oder gibt es Probleme beim Zugriff auf den Bereich?

2voto

fixermark Punkte 1192

Die Dokumentation für die Methode execfile lautet aquí . Da keine bestimmte Version von Python angegeben wurde, gehe ich davon aus, dass es sich um 2.6.2 handelt.

Die Dokumentation für execfile gibt an, dass es drei Argumente benötigt: den Dateinamen, ein Wörterbuch (das als lokale Variablen fungiert) und ein zweites Wörterbuch (das als globale Variablen fungiert). Wenn Sie das zweite und dritte Argument weglassen, wird der Inhalt der Datei in einem eigenen Bereich ausgeführt (wie ein Modul), der die lokalen Variablen erfasst, aber die globalen Variablen dem übergeordneten Bereich zugänglich macht. Wenn die Datei also lokale Variablen erstellt, werden diese nicht beibehalten, aber globale Variablen werden beibehalten.

Die Ausführung von execfile ohne Angabe von lokalen und globalen Kontexten bedeutet jedoch, dass die Datei die lokalen und globalen Kontexte der aufrufenden Funktion sieht. Für Code, dem Sie nicht trauen, sollte dies als Sicherheitslücke betrachtet werden. Im Allgemeinen ist es ratsam, zwei Wörterbücher für locals und globals zu erstellen und diese als zweites und drittes Argument an execfile zu übergeben. Wenn Sie diese Wörterbücher irgendwo aufbewahren (z.B. in einem anderen Wörterbuch, das durch den Dateinamen verschlüsselt ist), dann können Sie diese Wörterbücher beim nächsten Aufruf der Datei wiederverwenden, wodurch die von der Datei erzeugten Objekte am Leben erhalten werden.

Kurz gesagt: execfile ist nicht genau wie import. Aber Sie können Wörterbücher der Locals und Globals beibehalten, um die Ergebnisse eines execfile-Aufrufs zur erneuten Verwendung aufzubewahren.

1voto

Eli Courtwright Punkte 174547

Ich empfehle, nicht zu verwenden execfile . Stattdessen können Sie die angeforderte Python-Datei dynamisch als Modul importieren, indem Sie das eingebaute __import__ Funktion. Hier ist ein vollständiges, funktionierendes Beispiel, das ich gerade geschrieben und getestet habe:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.end_headers()

        filename = self.path.lstrip("/")
        self.wfile.write("You requested " + filename + "\n\n")
        if filename.endswith(".py"):
            pyname = filename.replace("/", ".")[:-3]
            module = __import__(pyname)
            self.wfile.write( module.do_work() )

HTTPServer(("",8080), Handler).serve_forever()

Wenn also in diesem Fall jemand Folgendes besucht http://localhost:8080/some_page dann wird "Sie haben eine Seite angefordert" gedruckt.

Aber wenn Sie einen Antrag stellen http://localhost:8080/some_module.py dann die Datei some_module.py wird als Python-Modul importiert und die do_work Funktion in diesem Modul aufgerufen wird. Wenn dieses Modul also den Code enthält

def do_work():
    return "Hello World!"

und Sie diese Anfrage stellen, dann wird die Seite wie folgt aussehen

You requested some_module.py

Hello World!

Dies sollte ein guter Ausgangspunkt für den Umgang mit solchen Dingen sein. Nebenbei bemerkt, wenn Sie einen fortgeschritteneren Webserver suchen, empfehle ich Ihnen CherryPy .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X