2016-03-23 24 views
0

Ich möchte mit einem Datenlogger über Telnet kommunizieren. Deshalb schrieb ich den folgenden Python-Skript:Schließen Plink-Fenster mit Python

import subprocess 

command ='plink.exe -telnet -P 23 12.17.46.06' 

p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1, shell=False) 

answer = p.communicate('command')[0] 
print answer 

Durch das Skript ausgeführt wird, ein Plink-Fenster erscheint. Das Python-Skript scheint auf eine Aktion im Befehlsfenster von plink zu warten. Durch das manuelle Schließen des Fensters wird die gewünschte "Antwort" in Python angezeigt.

Ich bin auf der Suche nach einem Befehl/Prozedur zum Schließen von Plink direkt aus Python. Es scheint nicht ausreichend zu sein, den Subprozess zu schließen, da in diesem Fall nur die Kommunikation zwischen python und plink geschlossen wird und nicht das Programm plink.exe selbst.

Jede Hilfe wird geschätzt! Grüße, Phil

Antwort

2

Die Dokumentation für die communicate() Funktion sagt: Warten auf Prozess zu beenden. Daher kehrt die Funktion nicht zurück, bis plink.exe beendet wird und Ihr Programm die Ausgabe bis dahin nicht erhält.

Sie sollten zu Ihrem 'command' etwas hinzufügen, das die Telnet-Verbindung schließt. Wenn das ferne Ende die Telnet-Verbindung schließt, wird plink.exe beendet und sein Fenster wird geschlossen. Wenn Ihre Telnet-Sitzung eine Unix-Shell ausführt, können Sie hinzufügen '; Beenden Sie Ihr Kommando.

+0

Danke für die Klarstellung bezüglich des communic() - Befehls. Die Frage bleibt jedoch, wie man Plink direkt von Python beenden kann. Das Python-Skript läuft unter Windows 7 64-Bit. –

+0

Ihre Frage ist ein [XY Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Plink wird beendet, wenn die Verbindung geschlossen wird. Woher willst du wissen * wann * um es zu töten? Sie können es töten, wenn Sie möchten, indem Sie ['.kill()'] (https://docs.python.org/3/library/subprocess.html#subprocess.Popen.kill) aufrufen. Natürlich kann Ihr Programm nichts tun, während es blockiert ist, bis der Prozess beendet wird. Sie möchten entweder Multithreading lernen (was ohne Bugs sehr schwierig ist) oder ein Timeout für die Kommunikation() bereitstellen oder einen nicht blockierenden Ansatz für die Verwaltung der Pipe verwenden. – dsh

+0

Okay, dann muss ich mein Problem neu formulieren: Wie kann ich die von plink ** mit Python ** hergestellte Telnet-Verbindung beenden? Ihr Vorschlag bezüglich einer Auszeit wäre für mich ausreichend. Wie ich bereits erwähnt habe, kann ich die Verbindung von Python zu Plink beenden, aber nicht die Telnet-Verbindung von Plink selbst. –

0

können Sie überprüfen, ob Ihre Aufgabe innerhalb Plink Tunnel abgeschlossen ist, und führen Sie dann taskkill in Ihrem Skript

etwas wie
killProg = taskkill /f /fi "imagename eq plink.exe"
p.communicate ('killProg') [0]

Das wird Plink töten, während der Tunnel geöffnet bleibt, um andere Befehle auszuführen.