2016-03-23 115 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,同时保持通道打开来执行其他命令。