【问题标题】:Terminate a subprocess if string is in output如果字符串在输出中,则终止子进程
【发布时间】:2019-03-14 16:12:27
【问题描述】:

如果输出中有字符串,我正在尝试终止子进程 pid,但它不起作用。怎么了?

import subprocess
import shlex


if "PING" in subprocess.check_call(shlex.split("ping -c 10 gogole.com")):
    subprocess.check_call(shlex.split("ping -c 10 gogole.com")).terminate()

【问题讨论】:

  • subprocess.check_call() 在进程退出之前不会返回,所以没有什么可以终止的。
  • 它也不返回进程输出,它返回一个CompletedProcess 对象。如果您想要输出,请使用check_output(),而不是check_call()
  • 如果你想运行一个子进程而不等待它退出,使用subprocess.Popen()然后从管道中读取。
  • 您对 Popen 的看法是正确的。 process = subprocess.Popen(shlex.split("ping -c 10 gogole.com"), stdout=PIPE) readme = process.stdout.read() if "PING" in readme: print "yes, is there"跨度>

标签: python if-statement subprocess shlex


【解决方案1】:

有关您调用的方法,请参阅文档。首先,check_call 一直执行到进程结束,然后返回进程的返回码。我不确定您打算如何从返回码(通常是整数)中找到“PING”。

如果它那里,请查看if 语句的主体:您创建了一个全新的ping 实例,等待它完成,然后尝试终止返回代码。

我建议您阅读有关子流程的教程。了解如何获取进程句柄并在 that 上调用操作。您需要获取输出流的句柄,在 that 中查找“PING”,然后在调用时获得的进程句柄上调用 terminate

【讨论】:

    【解决方案2】:
    import subprocess, os
    run = "ping -c 10 google.com"
    log = ""
    process = subprocess.Popen(run, stdout=subprocess.PIPE, shell=True)
    while True:
        out = process.stdout.read(1)
        log +=out
        print log
        if out == '' and process.poll() != None:
            break
        if "PING" in log:
            print "terminated!"
            process.kill()
            process.terminate()
            break
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多