Почему subprocess.run не читает новые строки, а subprocess.call делает? - PullRequest
0 голосов
/ 31 января 2019

Почему вызов исполняемого файла через subprocess.call дает разные результаты для subprocess.run?

Вывод метода вызова идеален - все новые строки удалены, форматирование документа точно правильное,Символы '-', маркеры и таблицы обрабатываются отлично.

Запуск точно такой же функции с методом run, однако, и чтение вывода из stdout полностью сбрасывает вывод.Полный символов '\ n', 'Â \ xad', '\ x97', '\ x8f' с интервалом по всему месту.

Вот код, который я использую:

Подпроцесс. ВЫЗОВ

result=subprocess.call(['/path_to_pdftotext','-layout','/path_to_file.pdf','-'])

Подпроцесс.RUN

result=subprocess.run(['/path_to_pdftotext','-layout','/path_to_file.pdf','-'],stdout=PIPE, stderr=PIPE, universal_newlines=True, encoding='utf-8')

ДонНе понимаю, почему метод run не анализирует и не отображает файл одинаково.Я бы использовал call, однако мне нужно сохранить результат преобразования pdftotext в переменную (в случае run: var = result.stdout).

Я могу пройти и просто определить весь Юникод, в котором он находитсяне запускается и не удаляется, но я полагаю, что должны быть некоторые настройки кодирования / декодирования, которые изменяет метод запуска.

EDIT

Прочитав аналогично сформулированный вопрос - я считаю, что он отличается по объему, так как я хочу понять, почему вывод отличается.

1 Ответ

0 голосов
/ 31 января 2019

Я провел несколько тестов.

Печатаете ли вы содержимое на консоли?Попытайтесь отправить текст в текстовом файле с подпроцессом в обоих случаях и посмотрите, отличается ли он:

result=subprocess.call(['/path_to_pdftotext','-layout','/path_to_file.pdf','test.txt'])

result=subprocess.run(['/path_to_pdftotext','-layout','/path_to_file.pdf','test2.txt'])

и сравните test.txt и test2.txt.В моем случае они идентичны.

Я подозреваю, что разница, которую вы испытываете, не связана строго с подпроцессом, а с тем, как консоль представляет выходные данные в обоих случаях.

Как сказано в ответе , на который я ссылаюсь в комментариях, call():

Это эквивалентно: run(...).returncode (за исключением того, что ввод ипараметры проверки не поддерживаются)

То есть ваш result хранит целое число (returncode), и вывод выводится на консоль, которая, кажется, показывает его с правильной кодировкой, символами новой строкии т. д.

С run() result является экземпляром CompletedProcess .Аргумент CompletedProcess.stdout:

Захваченный стандартный вывод дочернего процесса.Последовательность байтов или строка, если run () была вызвана с кодировкой или ошибками.Нет, если stdout не был захвачен.

Таким образом, будучи последовательностью байтов или строкой, python представляет ее по-разному при выводе на консоль, показывая все элементы '\ n', 'Â \ xad','\ x97', '\ x8f' и т. д.

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