2013-09-04 12 views
6

Ich habe eine Situation, in der ich ein Python-Skript in einer Endlosschleife ausführen muss, und ich muss Parameter aus einem anderen Skript übergeben, das ausgeführt wird, wenn ein Aktion tritt auf.Wie bekomme ich ein Python-Skript, um auf Eingaben von einem anderen Skript zu hören?

Das zweite Skript wird von einer Website mit CGI ausgelöst werden, ich habe das funktioniert gut. Die kontinuierliche Schleife sollte Parameter aufnehmen, die durch das CGI-Skript ausgelesen werden (und dann Informationen über eine serielle Schnittstelle senden).

Für das spezifische Problem kann ich nicht das CGI-Skript senden die Daten über die serielle direkt wie jedes Mal es läuft die serielle Schnittstelle zurückgesetzt.

Ich kann anscheinend keine Informationen über diese Art von Setup finden. Gibt es irgendwelche Methoden oder Bibliotheken, in denen ich nach diesen oder besseren Wegen suchen könnte?

+0

Haben Sie darüber nachgedacht, das 2. Skript mit Flask oder etwas zu machen und akzeptieren Sie die Parameter als http get Parameter? – JoelWilson

Antwort

8

Ich würde eine Socket-Verbindung verwenden. Im Wesentlichen schreiben Sie einen sehr einfachen Server, der nur eine Verbindung zu einem Zeitpunkt s.accept()

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("localhost", 9988)) 
s.listen(1) 

while True: 
    conn, addr = s.accept() 
    data = conn.recv(1024) 
    conn.close() 
    my_function_that_handles_data(data) 

nimmt einen blockierenden Aufruf. Es wartet auf eine Verbindung. Dann lesen Sie die Verbindung. In diesem Fall nehmen wir an, dass die Länge der Parameter nur 1024 Bytes beträgt. Dann machen wir etwas mit den Daten, die wir vom Socket erhalten haben und warten auf eine andere Verbindung.

Der Kunde könnte wie folgt aussehen:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(("localhost", 9988)) 
s.sendall('My parameters that I want to share with the server') 
s.close() 

Das Schöne daran ist, dass in der Zukunft, wenn der Client und Server sind nicht mehr auf der gleichen Maschine laufen, dann ist es einfach eine Frage der Veränderung "localhost" zu die tatsächliche IP-Adresse oder der Domainname, den Sie treffen werden.

+0

Es sieht so aus, als wäre es perfekt, ich bin schon mal über Steckdosen gestolpert, aber ich war mir nicht sicher, wie sie dafür arbeiten oder wie man sie benutzt, danke für das einfache Beispiel. Wird es später ausprobieren. – Ger

+0

Steckdosen sind ziemlich flexibel. Es gibt viele verschiedene Arten von Sockets, die Sie erstellen können. Sie müssen nicht über das Netzwerk hinweg sein. Wenn Sie Linux verwenden, können Sie einen Domain-Socket erstellen, der nur über den Kernel geroutet wird. – aychedee

+0

Arbeitete ein Charme, danke! – Ger

1

Das allgemeine Konzept dessen, was Sie beschreiben, heißt Interprozesskommunikation (Python IPC). In Python kann dies durch sockets und signals getan werden.

Es gibt auch übergeordnete Schnittstellen, die auf/mit Sockets aufgebaut sind; asyncore und asynchat.