簡體   English   中英

Python 對 Popen 的子進程使用超時

[英]Python use timeout for subprocess with Popen

我用 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)

您可以使用timeoutwaitmax命令為您使用waitmax運行的進程設置時間限制。 例如,要運行最多 10 秒的tail -f命令 -

import subprocess
process=subprocess.Popen(['timeout' ,'10', 'tail', '-f', '/var/log/syslog'], stdout=subprocess.PIPE)
out,err = process.communicate()

print out
Apr 26 21:40:01 linubuvma CRON[49447]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)
Apr 26 21:45:01 linubuvma CRON[50065]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr 26 21:55:01 linubuvma CRON[51271]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr 26 22:00:01 linubuvma CRON[51871]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)
Apr 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))
Apr 26 22:15:01 linubuvma CRON[53707]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr 26 22:17:01 linubuvma CRON[53951]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr 26 22:20:01 linubuvma CRON[54311]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)
Apr 26 22:25:01 linubuvma CRON[54937]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

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

你也可以在 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM