Проблема с выводом терминала из ImageMagick's Compare.exe (по трубе или Python) - PullRequest
2 голосов
/ 28 февраля 2011

Я довольно плохо знаком с 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.

Может кто-нибудьПожалуйста, помогите с этим, или дайте кому-нибудь понять, почему это происходит?

Ура,

Натан.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2011

Инструмент сравнения выводит результат на stderr. Конечно, это совершенно не имеет смысла, но чтобы обойти это, вам нужно перенаправить stderr в файл (вместо stdout)

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

Вам действительно лучше использовать модуль Python ImageMagick . EXE-файл даже не возвращает ненулевое значение в случае возникновения ошибки, поэтому вы не можете использовать его разумно в пакетном скрипте.

0 голосов
/ 28 февраля 2011

Похоже, что вы хотите PythonMagick .

EDIT:

Хорошо, основываясь на ответе 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)

Тем не менее, зачем использовать Popen, если вы можете использовать ImageMagick напрямую через привязки Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...