2016-03-23 146 views
0

我想通過Telnet與數據記錄器進行通信。因此,我寫了下面的python腳本:用Python關閉Plink窗口

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 

通過運行腳本,plink-windows彈出。 python腳本似乎等待在plink命令窗口內完成一些操作。通過手動關閉窗口,所需的「答案」出現在python中。

我正在尋找一個命令/過程來直接關閉python的plink。似乎不足以關閉子進程,因爲在這種情況下,只有python和plink之間的通信被關閉,而不是程序plink.exe本身。

任何幫助表示讚賞! 問候,菲爾

回答

2

communicate()函數的文檔說:等待進程終止。因此,函數不會返回,直到plink.exe退出,因此您的程序在此之前不會得到輸出。

您應該添加到您的'command'將關閉telnet連接的東西。遠端關閉遠程登錄連接時,plink.exe將退出並關閉其窗口。如果你的telnet會話運行一個unix shell,你可以添加';退出「你的命令。

+0

感謝澄清communicat()命令。然而,問題仍然是如何直接從python退出plink。 python腳本在Windows 7 64位上運行。 –

+0

你的問題是[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。連接關閉時,plink將退出。你怎麼知道*什麼時候殺死它?如果需要,可以通過調用['.kill()'](https://docs.python.org/3/library/subprocess.html#subprocess.Popen.kill)來殺死它。當然,當程序阻塞等待進程終止時,程序無法做任何事情。你要麼學習多線程(這是很難做到沒有錯誤),或提供通信超時()或使用非阻塞方法來管理管道。 – dsh

+0

好吧,那麼我必須重新制定我的問題:我怎樣才能殺死由python **建立的plink **的telnet連接?你對超時的建議對我來說足夠了。但是,正如我之前提到的,我可以終止從python到plink的連接,但不能連接plink本身的telnet連接。 –

0

您可以檢查是否砰砰隧道內你的任務就完成了,然後執行腳本中 TASKKILL

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

這會殺死plink,同時保持通道打開來執行其他命令。