用Python打印subprocess.Popen()输出
我正在遍历一个目录,并对每个文件运行用Python打印subprocess.Popen()输出,python,ffprobe,Python,Ffprobe,我正在遍历一个目录,并对每个文件运行ffprobe,以获取其持续时间。然而,我得到的唯一输出是 b'' b'' 下面是我正在使用的代码的一部分 for y in filename: p1 = subprocess.Popen (['ffprobe', '-i', y, '-show_entries', 'format=duration', '-sexagesimal', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")], stdout=subproce
ffprobe
,以获取其持续时间。然而,我得到的唯一输出是
b''
b''
下面是我正在使用的代码的一部分
for y in filename:
p1 = subprocess.Popen (['ffprobe', '-i', y, '-show_entries', 'format=duration', '-sexagesimal', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")], stdout=subprocess.PIPE).communicate()[0]
print (p1)
目前,我正在遍历的目录中有两个文件
你知道如何打印实际的持续时间吗
谢谢。如果您的内部命令正确,获取子流程输出的方法如下:
p1=subprocess.run(['ffprobe','-i',y',show_entries','format=duration','-sexagesimal','-v','quiet','of','csv=%s%%(“p=0”)],shell=True,capture_output=True)。stdout
导入子流程
导入glob
对于glob.glob中的y(“*.mkv”):
p1=子流程检查输出(
[
“ffprobe”,
“-我”,
Y
“-显示_条目”,
“格式=持续时间”,
“-sexagesimal”,
“-v”,
“安静”,
“-的”,
“csv=%s”(“p=0”),
],
encoding=“utf-8”,
).strip()
打印(y,p1)
对我来说很好。(也就是说,使用check_output()
并添加encoding
参数。)
结果是
2018-02-19T00:01.mkv 0:17:47.120000
正如所料
我的Ffmpeg版本是,无论如何
ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
您是否在终端内部测试了传递给
Popen
的命令的输出?是的,它可以工作。下面是结果,fprobe-i/Users/mbpuser1/Desktop/Remote2/av4_file1.ts-show_entries format=duration-sexagesimal-v quiet-of csv=“p=0”0:09:11.112389
您是否验证了文件名
var?它是否包含它应该包含的字符串?如果它们包含相对路径,请尝试绝对路径。如果filename
没有问题,请尝试使用os.system
或os.popen
而不是subprocess.popen
。您可以直接将字符串传递给这些方法,无需拆分它。如果它仍然不起作用,我很抱歉,但我已经没有想法了:/我必须承认我对编程非常陌生,但我猜没有打印输出。我认为b'
输出是因为我使用python3.7
解释代码。如果我使用python2.7
来解释代码,那么我会得到一个空行作为输出。你可以多读一点,但这可能对你没有帮助。尝试在for
循环的内打印y
的值(您只需执行:print(y)
),并检查其值是否正确。如果它们是正确的,那么将行p1=subprocess.Popen(…
替换为:p1=os.Popen(“ffprobe-i”+y+“-show_entries…).read()
(不要把literal…
替换为cmd的其余部分),并且不要忘记事先导入os
。如果这不起作用,我就没有主意了