Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python打印subprocess.Popen()输出_Python_Ffprobe - Fatal编程技术网

用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
。如果这不起作用,我就没有主意了