执行 popen 并超时

Hay*_*yat 3 subprocess multiprocessing python-3.x

所以我尝试专门通过subprocess.popen(). 我只想等待 30 秒来执行此命令,因为在某些情况下我的命令会挂起并且程序将永远等待。以下是我使用的两种方法。

方法一

cmd = "google-chrome  --headless  --timeout=30000  --ignore-certificate-errors --print-to-pdf out.pdf https://www.google.com/
process = subprocess.call(cmd, shell=True)
process.wait() # Here I want to wait only till 30 secs and not untill process completes
Run Code Online (Sandbox Code Playgroud)

方法2

from multiprocessing import Process
p1 = Process(target=subprocess.call, args=(cmd,))
        processTimeout = 50
        p1.start()
        p1.join(processTimeout)
        if p1.is_alive():
            p1.terminate()
Run Code Online (Sandbox Code Playgroud)

在第二种方法中,甚至没有创建文件。请建议一个选项。

Mis*_*agi 5

Popen.wait采用一个可选timeout参数。您可以使用它来仅等待特定时间的完成。如果超时触发,您可以终止该进程。

process = subprocess.call(cmd)
try:
    # if this returns, the process completed
    process.wait(timeout=30)
except subprocess.TimeoutExpired:
    process.terminate()
Run Code Online (Sandbox Code Playgroud)

从Python 3.5开始,您还可以使用subprocess.run便利函数。

subprocess.run(cmd, timeout=30)
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然会引发TimeoutExpired但会自动终止子进程。