在命令提示符下正确执行命令时,在subprocess.call()中使用find会出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在命令提示符下正确执行命令时,在subprocess.call()中使用find会出错相关的知识,希望对你有一定的参考价值。

C:WindowsSystem32> ffmpeg -i D:devarajKPIX_test.ts -vf "blackframe" -an -f n
ull - 2>&1|find "Parsed" > D:devarajinfo.txt

这工作正常,写入文件info.txt

subprocess.call('ffmpeg' ,'-i', 'D:devarajKPIX_test.ts' ,'-vf', '"blackframe"', 'D:devarajKPIX_textfinal.mp3', '- 2>&1>','|','find', '"Parsed"', '>' ,'D:devarajinfo.txt', 'shell=True')

给出错误缓冲区大小必须是整数

是的

subprocess.call('ffmpeg -i D:devarajKPIX_test.ts -vf "blackframe" -an -f n
ull - 2>&1|find "Parsed" > D:devarajinfo.txt', shell=True) 

给出错误

'find'不被识别为内部或外部命令,可操作程序或批处理文件。

任何帮助都会从内心深处感激

答案

你应该使用本机python方法来获得过滤的ffmpeg输出:

ffmpeg -i D:devarajKPIX_test.ts -vf "blackframe" -an -f null - 2>&1|find "Parsed"

要做到这一点,你通常需要check_output,但这个特殊的例子已知提供所需的信息,但退出时返回非零代码(使用Python 3.5中的run会起作用)

所以我会改用Popen。它变为(作为列表,没有所有重定向和过滤器),然后从过程标准输出中读取所有输出:

p = subprocess.Popen(["ffmpeg","-i",r"D:devarajKPIX_test.ts",
         "-vf","blackframe","-an","-f","null"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = p.stdout.read()

您不需要shell=True,它会在output变量中合并错误和输出流。

现在output包含ffmpeg命令的输出。让我们解码它(获取一个字符串)并拆分行,检查字符串是否在行中:

for line in output.decode().splitlines():  # python 2: output.splitlines()
   if "Parsed" in line:
       print(line.rstrip())  # or store it in a file, string, whatever

对于输出更多文本的进程,最好迭代p.stdout而不是读取全部内容(更少的内存饥饿,允许实时回显到控制台)

以上是关于在命令提示符下正确执行命令时,在subprocess.call()中使用find会出错的主要内容,如果未能解决你的问题,请参考以下文章

解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题

解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题

从我的 VB.NET 应用程序中在命令提示符下执行命令列表

“java -version”在命令提示符下不起作用

sudo命令:解决使用Linux命令行时出现的错误提示

使用 excel VBA 在命令提示符下执行命令