【问题标题】:Closing Plink window with Python使用 Python 关闭 Plink 窗口
【发布时间】:2016-03-23 16:26:19
【问题描述】:

我想通过 Telnet 与数据记录器通信。因此,我编写了以下 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

通过运行脚本,会弹出一个 plink-windows。 python 脚本似乎在等待在 plink 命令窗口中执行某些操作。通过手动关闭窗口,所需的“答案”会出现在 python 中。

我正在寻找一个命令/程序来直接从 python 中关闭 plink。仅仅关闭子进程似乎是不够的,因为在这种情况下,只有 python 和 plink 之间的通信被关闭,而不是程序 plink.exe 本身。

感谢任何帮助! 问候,菲尔

【问题讨论】:

    标签: python telnet plink


    【解决方案1】:

    communicate() 函数的文档说:等待进程终止。 因此该函数在 plink.exe 退出之前不会返回,因此您的程序在此之前不会获得输出。

    您应该在您的'command' 中添加一些可以关闭 telnet 连接的内容。当远端关闭 telnet 连接 plink.exe 将退出并关闭其窗口。如果您的 telnet 会话运行 unix shell,您可以添加 ';退出'到你的命令。

    【讨论】:

    • 感谢您对communicate() 命令的澄清。但是,问题仍然是如何直接从 python 中退出 plink。 python 脚本在 Windows 7 64 位上运行。
    • 您的问题是XY Problem。 plink 将在连接关闭时退出。你怎么知道何时杀死它?如果你愿意,你可以通过调用.kill() 来杀死它。当然,您的程序在等待进程终止时无法执行任何操作。您要么想学习多线程(没有错误很难做到这一点),要么提供超时来通信()或使用非阻塞方法来管理管道。
    • 好的,那我得重新表述我的问题:如何杀死 plink with python 建立的 telnet 连接?您关于超时的建议对我来说已经足够了。但是,正如我之前提到的,我可以终止从 python 到 plink 的连接,但不能终止 plink 本身的 telnet 连接。
    • 您可以通过调用.kill() 来终止进程,正如我在之前的评论中指出的那样。当进程不存在时,它的连接也不存在。
    • 添加 .kill() 并没有改变任何东西。 Plink 窗口保持打开状态。
    【解决方案2】:

    您可以检查您在 plink 隧道中的任务是否完成,然后执行 脚本中的 taskkill

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

    这将杀死 plink,同时保持隧道打开以执行其他命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      相关资源
      最近更新 更多