如何在Python中分离ffplay子进程以继续执行后续代码?
解决ffplay阻塞Python脚本的问题
你遇到的核心问题是subprocess.call()是阻塞式调用——它会让Python脚本暂停,直到ffplay进程结束才会继续执行后面的代码。要把ffplay和剩余Python逻辑分离,我们需要用非阻塞的方式启动ffplay,也就是subprocess.Popen()。
修改后的完整代码
from selenium import webdriver from subprocess import call, Popen, DEVNULL import subprocess, sys import time import urllib import urllib2 # 用非阻塞方式启动ffplay,Python会继续执行后续代码 ffplay_pid = Popen( ["ffplay", "-fflags", "nobuffer", "udp://:8554"], stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL, start_new_session=True ) # 启动Selenium驱动 driver = webdriver.Firefox(executable_path='/usr/bin/geckodriver') # 每10秒重启一次GoPro流 while True: time.sleep(10) driver.get("http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart")
关键修改说明
- 替换
call()为Popen():Popen()会立即返回一个进程对象,不会阻塞Python主进程,这样后面的Selenium初始化和循环逻辑能正常执行。 - 添加
stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL:避免ffplay的输出信息干扰Python脚本的控制台输出,同时防止因为标准输入输出绑定导致的潜在问题。 start_new_session=True:让ffplay在独立的会话中运行,即使Python脚本意外退出,ffplay也能保持运行(如果需要的话,也可以后续通过ffplay_pid.terminate()手动终止它)。
额外优化建议
如果你需要在脚本结束时自动关闭ffplay和Selenium驱动,可以给循环加上异常捕获,实现优雅退出:
try: while True: time.sleep(10) driver.get("http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart") except KeyboardInterrupt: ffplay_pid.terminate() driver.quit()
这样按下Ctrl+C时,会自动关闭ffplay窗口和Firefox浏览器。
内容的提问来源于stack exchange,提问作者Dosclic 98
相关产品推荐
相关产品推荐

