python3: принудительное использование utf-8 для stdout / stderr без внешней настройки PYTHONIOENCODING? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую python3, и я хочу, чтобы моя программа использовала utf-8 для stdout и stderr без необходимости устанавливать переменную окружения PYTHONIOENCODING в utf-8 вне программы python.

Другими словами, я хочу, чтобы выбор принудительного вывода utf-8 содержался в самой программе python, независимо от того, какой параметр PYTHONIOENCODING или его отсутствие могли быть указаны в среде вызывающего.

Единственный специфический для Python3 способ сделать это, который я до сих пор выяснил, - это запустить программу следующим образом:

#!/usr/bin/python3.6                                                                                                            

import os
import sys
if os.environ.get('PYTHONIOENCODING', '').lower() != 'utf-8':
    os.environ['PYTHONIOENCODING'] = 'utf-8'
    sys.exit(os.execl(
        sys.executable, 
        os.path.basename(sys.executable), 
        *sys.argv
    ))

# Remainder of my program ...

В идеале, я хотел бы реализовать это безповторно выполнить интерпретатор python3, но я боюсь, что мне, вероятно, не повезло.

Есть предложения?Большое спасибо.

ADDENDUM:

Согласно комментариям в ответе ниже, я попробовал следующее, но ничего не печатается ...

#!/usr/bin/python3.6
open(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
open(sys.stderr.buffer.fileno(), 'w', encoding='utf8')
print('Seems to be working')
sys.exit(0)

Я также попробовал utf-8 (с дефисом), и он тоже ничего не печатает.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Некоторые люди предлагают

sys.stdout = codecs.getwriter("UTF-8")(sys.stdout)

Другие говорят, что могут сломать некоторые библиотеки.

0 голосов
/ 18 апреля 2019

И теперь я лучше понимаю, что предложил Lenz, и я выяснил ответ:

#!/usr/bin/python3.6
import os
import sys
sys.stdout = os.fdopen(sys.stdout.buffer.fileno(), 'w', encoding='utf8')
sys.stderr = os.fdopen(sys.stderr.buffer.fileno(), 'w', encoding='utf8')
...