我试图用以下代码捕获命令的输出:
lines = subprocess.run(['ffmpeg', '-hide_banner', '-nostats', '-i', in_filename, '-vn', '-af', 'silencedetect=n={}:d={}'.format(silence_threshold, silence_duration), '-f', 'null', '-'], capture_output=True, text=True, shell=True, check=True, encoding='utf-8').stdout
print (lines)
但是行是一个空字符串,什么都不打印。删除capture_output=True
时,将显示正确的输出(不打印输出)。
我测试了许多组合,包括删除所有subprocess.run
参数,并且只包含具有相同结果的capture_output=True
。
我也用很少的论据测试了一个最小的例子:subprocess.run(['ffmpeg', '-version'], capture_output=True, text=True, shell=True, check=True, encoding='utf-8').stdout
还测试了stdout=subprocess.PIPE
和stderr=subprocess.PIPE
作为subprocess.run
参数而不是capture_output=True
我不知道发生了什么。提前感谢!
发布于 2022-07-24 21:30:01
默认情况下,ffmpeg
日志到stderr
。您使用capture_output=True
,因此run()
func将捕获stdout
和stderr
值。
行是一个空字符串,什么都不打印。
这是正常的,因为默认情况下ffmpeg不登录到stdout。
当capture_output=True
被删除时,将显示正确的输出(不打印输出)。
这是我们所期望的,当您删除capture_output=True
,然后将ffmpeg
日志移到stderr
(默认情况下到您的终端/控制台),您将在屏幕上看到ffmpeg输出(stdin,stdout,and stderr
这些通常附加到用户的终端)。当您使用capture_output=True
时,ffmpeg的日志将转到内存中的内核pipe
类文件对象(在Unix和Linux中,不了解windows)。这就是为什么在没有捕获的标准输出的情况下,终端/控制台中看不到任何输出的原因。
subprocess.run()
函数将返回CompletedProcess(process.args, retcode, stdout, stderr)
实例,您可以获得stdout
属性值,但我们不需要它,我们需要stderr
属性值,因为默认情况下,ffmpeg
会记录到stderr
。
你需要修改它,就像;
lines = subprocess.run(['ffmpeg', '-hide_banner', '-nostats', '-i', in_filename, '-vn', '-af', 'silencedetect=n={}:d={}'.format(silence_threshold, silence_duration), '-f', 'null', '-'], capture_output=True, text=True, shell=True, check=True, encoding='utf-8').stderr
print (lines)
https://stackoverflow.com/questions/62991490
复制相似问题