我认为Popen 是您正在寻找的。p>
这是一个代码示例:
import subprocess
import time
process = subprocess.Popen(['ffplay', '-hide_banner', '-nostats', '-autoexit', 'video.mp4'])
for i in range(10):
time.sleep(1)
print('Continue running ' + str(i))
process.wait()
subprocess.Popen打开一个新的子进程,子子进程在后台执行。
Python 脚本在subprocess.Popen 之后继续运行。
您可以等待子进程完成,或终止它(或让它运行)。
抓取stdout 和stderr 输出的示例(将FFplay 输出读入Python 的内存)。
import subprocess
import time
process = subprocess.Popen(['ffplay', '-autoexit', '-t', '1', 'video.mp4'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
process.wait()
print('stdout = ' + stdout.decode('utf-8'))
print('stderr = ' + stderr.decode('utf-8'))
在执行其他操作时“在飞行中”读取 FFplay 统计信息,需要一个线程。
在 Windows 中,我们似乎需要从 stderr 逐字节读取。
readline() 不起作用,因为 FFplay 输出行以 LF (\r) 字符结尾。
这是一个代码示例:
import subprocess
import threading
# Read from stderr pipe - "draining the stderr pipe"
def drain_pipe(a_process):
output_txt = b''
while a_process.poll() is None:
try:
# Read one byte at a time, it's the only way it works in Windows, because lines ends with just \r.
a_char = a_process.stderr.read(1)
output_txt += a_char
if a_char == b'\r': # Look for line feed character.
print(output_txt.decode('utf-8'))
output_txt = b''
except:
break # Exception may be raised because the pipe closes asynchronous
process = subprocess.Popen(['ffplay', '-stats', '-autoexit', 'video.mp4'], stderr=subprocess.PIPE)
stderr_thread = threading.Thread(target=drain_pipe, args=(process,)) # Create a thread for reading from stderr
stderr_thread.start() # Start thread
# some more code...
process.wait()
stderr_thread.join() # Join thread