У меня есть приложение Windows, называемое pregeocode (у нас нет источника), эта программа в основном записывает геокодирование во входной файл. Эта программа на самом деле ничего не пишет на консоль, если есть ошибка. Эта программа, как правило, вызывается из небольшой программы Python (она обрабатывает аргументы и т. Д. И делает все, что нужно для предварительной обработки).Захват вывода консоли, который не записывается в stdout, stderr?
Мы проверяем, не сработало ли оно, посмотрев, действительно ли был создан выходной файл (он всегда возвращает 0, несмотря ни на что). Однако, когда он не работает, подпроцесс показывает, что ничего не было напечатано в stderr или stdout. (Он обрабатывает около ста или так успешно, с usasally только один из них плохой, но мне бы хотелось увидеть, что вызывает ошибку)
Маленький скрипт python вызывает приложение через подпроцесс.Popen:
argslist = [r'C:\workspace\apps\pregeocode.exe', '-in', inputfilename, '-out', outputfilename, '-gcp', gcp_file]
p = subprocess.Popen(argslist, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print str(p.communicate())
дает выход:
('', '')
Однако, если я запустить программу вручную, используя те же аргументы через ЦМД, я получаю выход:
45 IMAGE_EXTENT_TOO_SMALL
(Существует около 60 различных нечетных сообщений об ошибках, 45 указывает номер ошибки)
Использование оболочки = True аргумент ничего не изменится, и я не могу ничего найти в Интернете об этой проблеме. Фактический exe - это то, что было сделано в доме давным-давно, и нам не хватает исходного кода, поэтому я не вижу, как он печатает сообщения.
Так почему же подпроцесс не может фактически захватить stdout или stderr этого?
EDIT
os.system(" ".join(argslist))
правильно печатает сообщение об ошибке:
45 IMAGE_EXTENT_TOO_SMALL
EDIT 2
Оказывается, приложение использует инструментарий ERDAS в. Их инструментарий перенаправляет все stdout/stderr в свою подсистему регистрации. Подсистема протоколирования затем перезаписывает ее через «CON».
Что происходит, когда вы запускаете его из cmd с '2> out.err'? Выводит ли out.err текст? –
Yup правильно распечатывает сообщение. – UberJumper
Чтобы быть уверенным, «распечатать» означает «помещает его в файл», правильно? Он не отображается на экране. –