Python выводит CR CR LF?

Я нахожусь в процессе написания сценария тестирования, который просто запустит файл *.EXE с несколькими аргументами, а затем выведет результат в файл. У меня есть один *.sh тестовый скрипт, который правильно запускает тесты (но требует дополнительного обновления для большего количества тестов). Строки в этом скрипте выглядят так:

blah.exe arg1 arg2 arg3 > ../test/arg4/arg4.out

Я написал скрипт на Python для автоматической генерации аргументов на основе нескольких простых модулей на Python (сейчас это довольно грубо):

import os
import subprocess

for test_dir in os.listdir():
    if not os.path.isdir(test_dir):
        continue
    # load a few variables from the ./test_dir/test_dir.py module
    test_module = getattr(__import__(test_dir, fromlist=[test_dir]), test_dir)

    # These arguments are relative paths, fix the paths
    arg1 = os.path.join(test_dir, test_module.ARG1)
    arg2 = os.path.join(test_dir, test_module.ARG2)
    arg3 = os.path.join(test_dir, test_module.ARG3)

    proc = subprocess.Popen(["../bin/blah.exe", arg1, arg2, arg3], stdout=subprocess.PIPE)

    stdout_txt = proc.stdout.read().decode("utf-8")

    with open(os.path.join(test_dir, test_dir + '.out'), 'w') as f:
        f.write(stdout_txt)

Я открыл файлы для сравнения и во время работы скрипта натолкнулся на проблему. Первое (shell) решение выводит правильные окончания строк. Второе (python) решение выводит строки, заканчивающиеся CR CR LF. В Notepad это выглядит правильно, но в Notepad++ каждая вторая строка выглядит пустой:

Эти строки не должны иметь пустых строк между ними

Почему выходные данные из python дают неправильные окончания строк?

Как я могу исправить окончания строк? (изменить CR CR LF на CR LF без необходимости писать другой скрипт)

1 ответ

Решение

Попробуйте использовать universal_newlines=True аргумент Popen (см. http://docs.python.org/library/subprocess.html).

Другие вопросы по тегам