从ImageMagick的compare.exe获取终端输出时的问题(通过管道或Python)

2 投票
2 回答
1786 浏览
提问于 2025-04-16 12:41

我刚开始学习Python,但之前有一些其他编程语言的经验。我想知道有没有人能帮我。

问题

我想比较两张图片(使用ImageMagick的compare.exe),然后根据输出结果做出决定。

我遇到了一些问题,因为我似乎无法将compare.exe的输出结果引入到我自己的代码中。

在命令行运行我的命令时,我得到了所需的差异指标:

C:\usr\local\bin\att>compare -metric AE -fuzz 2000 1.png 2.png diff.png
8772
C:\usr\local\bin\att>_

但如果我尝试将这个输出重定向到一个文本文件:

C:\usr\local\bin\att>compare -metric AE -fuzz 2000 1.png 2.png diff.png > tmp.txt
8772

那么这个指标仍然会显示在控制台上,而不是写入文本文件。

到目前为止,我在Python中唯一成功的做法是延迟输出,但我仍然无法将其捕获到一个变量中。

执行:

myOutput=subprocess.Popen("C:\\usr\\local\\bin\\att\\compare.exe -metric AE -fuzz 100 1.png 2.png mask.png", stdout=subprocess.PIPE)

在控制台上不会显示'8772',直到我调用:

line = myOutput.stdout.readline()

这时它会被写入控制台输出,但我的变量会是NULL。

有没有人能帮我解决这个问题,或者知道为什么会这样吗?

谢谢,

Nathan。

2 个回答

4

这个比较工具的结果会输出到错误信息流(stderr)上。虽然这样做完全没有道理,但为了应对这个问题,你需要把错误信息流转发到一个文件里(而不是标准输出流stdout)。

compare -metric AE -fuzz 2000 1.png 2.png diff.png 2> tmp.txt

其实你更应该使用Python ImageMagick这个模块。因为那个EXE文件在出错时甚至不会返回一个非零的值,所以你根本没法在批处理脚本中合理使用它。

0

看起来你想要的是 PythonMagick

编辑:

好的,根据AndiDog的回答,你的 Popen 调用应该是这样的:

myOutput=subprocess.Popen("C:\\usr\\local\\bin\\att\\compare.exe -metric AE -fuzz 100 1.png 2.png mask.png", stderr=subprocess.PIPE)

或者,如果 stdout 也输出有用的信息,你可以这样做:

myOutput=subprocess.Popen("C:\\usr\\local\\bin\\att\\compare.exe -metric AE -fuzz 100 1.png 2.png mask.png", stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

不过,既然可以通过Python的绑定直接使用ImageMagick,为什么还要用Popen呢?

撰写回答