【问题标题】:Python - Using timeout while printing line by line in a subprocess with PopenPython - 在使用 Popen 的子进程中逐行打印时使用超时
【发布时间】:2018-05-28 00:15:01
【问题描述】:

(在 Python 3.5 中)

我难以逐行打印标准输出(在运行程序时),并保持超时功能(一段时间后停止程序)。

我有:

import subprocess as sub
import io

file_name = 'program.exe'
dir_path = r'C:/directory/'

p = sub.Popen(file_name, cwd = dir_path, shell=True, stdout = sub.PIPE, stderr = sub.STDOUT)

在运行“p”时,做以下两件事:

for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
   print(line)

然后做:

try:
    outs = p.communicate(timeout=15)   # Just to use timeout

except Exception as e:
    print(str(e))
    p.kill()

程序应打印每个输出行,但运行模拟的时间不应超过 15 秒。

如果我在“p.stdout”之前使用“p.communicate”,它将等待程序超时完成。如果我换一种方式使用,程序不会计算超时时间。

我想在没有线程的情况下做到这一点,如果可能的话也没有 io,这似乎是可能的,但我不知道如何(需要更多的练习和学习)。 :-(

PS:我正在运行的程序是用fortran编写的,用于模拟水流。如果我从 Windows 运行 exe,它会打开一个 cmd 并在每个时间步上打印一行。我正在做一个敏感性分析,改变 exe 文件的输入。

【问题讨论】:

    标签: python-3.x timeout subprocess stdout


    【解决方案1】:

    那是因为您的进程\子进程没有被正确杀死 只是修改你的尝试,除了如下

    try:
        pid_id=p.pid
        outs = p.communicate(timeout=15)   # Just to use timeout
    
    
    except Exception as e:
        print(str(e))
        import subprocesss
        #This will kill all the process and child process associated with p forcefully 
        subprocess.Popen('taskkill /F /T /PID %i' % pid_id)
    

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      相关资源
      最近更新 更多