当前位置: 主页 > 日志 > Python >

Python带超时的命令执行(兼容Windows和Linux)

之前发过一个类似的http://www.redicecn.com/html/Python/20120906/434.html,但是仅支持Windows平台,在Linux下命令超时后进程杀不死。

下面的方法能够同时支持Windows和Linux平台:

import os
import platform
import subprocess
import signal
import time

class TimeoutError(Exception):
    pass

def command(cmd, timeout=60):
    """Run command and return the output
    cmd - the command to run
    timeout - max seconds to wait for
    """
    is_linux = platform.system() == 'Linux'
    
    p = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid if is_linux else None)
    t_beginning = time.time()
    seconds_passed = 0
    while True:
        if p.poll() is not None:
            break
        seconds_passed = time.time() - t_beginning
        if timeout and seconds_passed > timeout:
            if is_linux:
                os.killpg(p.pid, signal.SIGTERM)
            else:
                p.terminate()
            raise TimeoutError(cmd, timeout)
        time.sleep(0.1)
    return p.stdout.read()

if __name__ == '__main__':
    try:
        result = command('ping www.site-digger.com', timeout=10)
    except TimeoutError:
        print 'Run command timeout.'
    else:
        print result

[日志信息]

该日志于 2013-01-03 10:54 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “Python带超时的命令执行(兼容Windows和Linux)” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部