首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >subprocess.run输出为空(python3.8)

subprocess.run输出为空(python3.8)
EN

Stack Overflow用户
提问于 2020-07-20 08:31:08
回答 1查看 1.3K关注 0票数 5

我试图用以下代码捕获命令的输出:

代码语言:javascript
运行
复制
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.PIPEstderr=subprocess.PIPE作为subprocess.run参数而不是capture_output=True

我不知道发生了什么。提前感谢!

EN

Stack Overflow用户

发布于 2022-07-24 21:30:01

默认情况下,ffmpeg 日志stderr。您使用capture_output=True,因此run() func将捕获stdoutstderr值。

行是一个空字符串,什么都不打印。

这是正常的,因为默认情况下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

你需要修改它,就像;

代码语言:javascript
运行
复制
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)
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62991490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档