【问题标题】:Python use timeout for subprocess with PopenPython对Popen的子进程使用超时
【发布时间】:2015-07-05 08:07:05
【问题描述】:

我正在使用 popen 运行以下脚本

process = subprocess.Popen(['python', 'solver.py', 'newsudoku.csp', '-i', 'arc'], stdout=subprocess.PIPE)
out, err = process.communicate()

我需要处理存储在 out 变量中的输出

问题是这个脚本的执行时间会有所不同,如果它超过 60 秒,我需要杀死它。我知道 python 3 有 check_call 超时,但我正在运行的另一个脚本在 python 2.7 中

那么我如何计算 60 秒然后终止子进程呢?如果发生这种情况,理想情况下也可以做其他事情(将 1 添加到计数器)

【问题讨论】:

标签: python timeout subprocess popen


【解决方案1】:

您可以使用timeout 或waitmax 命令为您使用Popen 运行的进程设置时间限制。例如,运行 tail -f 命令最多 10 秒 -

导入子流程 process=subprocess.Popen(['timeout' ,'10', 'tail', '-f', '/var/log/syslog'], stdout=subprocess.PIPE) out,err = process.communicate() 打印出 4 月 26 日 21:40:01 linubuvma CRON[49447]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp) 4 月 26 日 21:45:01 linubuvma CRON[50065]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1) 4 月 26 日 21:55:01 linubuvma CRON[51271]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1) 4 月 26 日 22:00:01 linubuvma CRON[51871]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp) 4 月 26 日 22:05:01 linubuvma CRON[52491]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1) Apr 26 22:09:01 linubuvma CRON[52975]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/ lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)) 4 月 26 日 22:15:01 linubuvma CRON[53707]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1) 4 月 26 日 22:17:01 linubuvma CRON[53951]: (root) CMD (cd / && run-parts --report /etc/cron.hourly) 4 月 26 日 22:20:01 linubuvma CRON[54311]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp) 4 月 26 日 22:25:01 linubuvma CRON[54937]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

tail 命令恰好在 10 秒后终止。

【讨论】:

  • 不敢相信这么简单!谢谢!
【解决方案2】:

你也可以在 python 3.7.4 中做这样的事情:

p1 = subprocess.Popen(['python', 'solver.py', 'newsudoku.csp', '-i', 'arc'], stderr = subprocess.PIPE) 
    try:
        outs, errs = p1.communicate(timeout=60) # will raise error and kill any process that runs longer than 60 seconds
    except subprocess.TimeoutExpired as e:
        p1.kill()
        outs, errs = p1.communicate()
        print(outs)
        print(errs)

【讨论】:

  • 我们可以在 subprocess.call 中使用它吗?
  • 我更喜欢这种方法,因为它在 python 级别处理时间。 .csp 是否代表“逗号分隔拼图”?
猜你喜欢
  • 2018-05-28
  • 2014-09-15
  • 2018-12-05
  • 1970-01-01
  • 2012-03-03
  • 2012-09-18
  • 2020-11-30
相关资源
最近更新 更多