Запретить автоматическое преобразование новой строки Python print() в CRLF в Windows

Я хотел бы передавать текст с помощью unix-подобного EOL (LF) из Python через Windows CMD (консоль). Однако Python, по-видимому, автоматически преобразует отдельные символы новой строки в конец строки (EOL) в стиле Windows символы (т.е. \r\n, <CR><LF>, 0D 0A, 13 10):

#!python3
#coding=utf-8
import sys
print(sys.version)
print("one\ntwo")
# run as py t.py > t.txt

приводит к

3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
one
two

или в шестнадцатеричном формате ... 6F 6E 65 0D 0A 74 77 6F 0D 0A

Второй EOL связан с тем, что print() по умолчанию имеет значение end='\n', но также преобразование.

Для печати нет аргумента или свойства newline, как для open(), так как же этим можно управлять?


person handle    schedule 07.04.2018    source источник
comment
См. раздел Печать LF с помощью Python 3 в стандартный вывод Windows.   -  person Steven Rumbalski    schedule 07.04.2018
comment
@StevenRumbalski Черт, спасибо.   -  person handle    schedule 07.04.2018
comment
Без проблем. Советую не удалять вопрос. Ваш вопрос поможет людям найти другого.   -  person Steven Rumbalski    schedule 07.04.2018
comment
@StevenRumbalski Не мог бы и мечтать об этом, на компиляцию ушла целая вечность - только закрытие. Предыдущий ответ гораздо более краток и содержит справочную информацию.   -  person handle    schedule 07.04.2018


Ответы (1)


person    schedule
comment
Будьте осторожны с восстановлением sys.stdout. По умолчанию освобождение нового TextIOWrapper приводит к закрытию буфера и, как правило, дескриптора файла stdout. Определите его как new_stdout = io.TextIOWrapper(sys.stdout.buffer, newline='\n', encoding=sys.stdout.encoding, errors=sys.stdout.errors); old_stdout, sys.stdout = sys.stdout, new_stdout. Затем, чтобы переназначить, используйте sys.stdout = old_stdout, а перед освобождением нового вызовите new_stdout.detach(), чтобы он не закрывал базовый буфер. Или, если у вас есть fd, вы можете open его с помощью closefd=False или dup fd. - person Eryk Sun; 07.04.2018
comment
@eryksun Спасибо за предупреждение, я добавлю ссылку на ваш комментарий и, вероятно, вместо этого просто использую ваше решение open. - person handle; 08.04.2018