如何跳过子进程超时

时间:2017-03-11 15:27:04

标签: python timeout subprocess

我正在读取文件并将网站循环到子进程调用中,该调用使用脚本连接到它并将其输出到终端。有些网站没有连接,我需要跳过它们。

cmd = subprocess.check_output([os.path.dirname(sys.argv[0])+ SCRIPT],  stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=1)

没有超时,它只会挂起太长时间

我试过尝试,除了

try
    cmd = subprocess.check_output([os.path.dirname(sys.argv[0])+ SCRIPT],  stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=1)

except subprocess.CalledProcessError:
    print(e)
    #pass

但它显示错误:

Traceback (most recent call last):
  File "/usr/lib/python3.5/subprocess.py", line 695, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "/usr/lib/python3.5/subprocess.py", line 1716, in _communicate
    self._check_timeout(endtime, orig_timeout)
  File "/usr/lib/python3.5/subprocess.py", line 1098, in _check_timeout
    raise TimeoutExpired(self.args, orig_timeout)
subprocess.TimeoutExpired: Command '['./SCRIPT timed out after 1 seconds

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./find_prime.py", line 22, in <module>
    stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=1)
  File "/usr/lib/python3.5/subprocess.py", line 626, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.5/subprocess.py", line 700, in run
    stderr=stderr)
subprocess.TimeoutExpired: Command '['./SCRIPT']' timed out after 1 seconds

在某些网站上,它调用异常并转到下一个网站,但在其中一些网站上它甚至没有转到异常并输出显示的错误

1 个答案:

答案 0 :(得分:1)

您应该能够捕获TimeoutExpired执行并忽略它

try:
    cmd = subprocess.check_output([os.path.dirname(sys.argv[0])+ SCRIPT], stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=1)
except subprocess.CalledProcessError e:
    print(e)
except subprocess.TimeoutExpired:
    pass