【问题标题】:Problem getting terminal output from ImageMagick's compare.exe ( Either by pipe or Python )从 ImageMagick 的 compare.exe 获取终端输出时出现问题(通过管道或 Python)
【发布时间】:2011-07-05 22:54:59
【问题描述】:

我对 python 还很陌生,但对其他语言有相当多的经验。我想知道是否有人可以提供帮助。

问题 我正在尝试合并两个图像的比较(使用 ImageMagicks 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。

谁能帮忙解决这个问题,或者任何人都知道为什么会发生这种情况?

干杯,

内森。

【问题讨论】:

    标签: python imagemagick


    【解决方案1】:

    比较工具将结果输出到标准错误。当然这完全没有意义,但要解决它,您需要将 stderr 转发到文件(而不是 stdout)

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

    使用Python ImageMagick 模块真的会更好。如果出现错误,EXE文件甚至不会返回非零值,所以在批处理脚本中不能真正合理地使用它。

    【讨论】:

    • 啊,所以它在stderr上输出。好的,但是有一种更好的方法可以在 Python 中捕获 stderr ... +1。
    【解决方案2】:

    好像你想要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?

    【讨论】:

    • 谢谢大家,我会使用 ImageMagick 模块,但不幸的是,我可以安装的内容有所限制。
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 2017-01-11
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多