Как установить переменную среды PYTHONUTF8 для включения кодировки UTF-8 по умолчанию в Python?

1

В Python 3.7 была введена переменная среды PYTHONUTF8, позволяющая по умолчанию кодировать UTF-8. Как установить эту переменную из программы Python? (Я не могу найти его в списке операционных систем переменных среды).

Теги:
python-3.x
utf-8

3 ответа

2
Лучший ответ

Чтобы получить доступ к переменным окружения и изменить их, если ваша платформа позволяет это (что делает Windows и все популярные Unix), просто используйте os.environ.

Однако это не будет делать ничего хорошего, если вы не попытаетесь установить переменную окружения для дочерних процессов Python, которые вы запускаете с помощью subprocess или тому подобного. Python считывает свои переменные среды при запуске, использует их для получения информации о конфигурации и не проверяет их позже.


Точкой этих переменных среды (и флагов командной строки) является их установка в вашей оболочке, сценарии запуска и т.д., Поэтому они доступны при запуске Python, а не для установки из Python.

Обычно, если вам нужен этот параметр, вам понадобится глобальное решение, поэтому вы захотите установить его в своем сценарии профиля оболочки (для Linux), графическом интерфейсе вашей ОС для переменных среды (для Windows) или обоих (для macOS-хотя и для Mac, все уже гарантировано установлено на UTF-8, и я верю, даже если вам удастся это сломать, Python проигнорирует его).

Вы не найдете этого в своем существующем списке переменных окружения (если, возможно, вы не используете необычный дистрибутив Linux, который делает что-то странное с настройками локали, но для его игнорирования Python ему не нужен), но это не имеет значения; вы можете добавить любые переменные среды, которые вы хотите.


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

Как объясняют документы, что он контролирует, это настройка кодировки файловой системы, предпочтительной кодировки и кодирования файлов stdio.

Первые два, вы можете просто вызвать те же функции в sys и locale чтобы установить их в любое время.

Если вы также хотите изменить файлы stdio, это немного сложнее. Я считаю, что предложение облегчить изменение кодировки этих файлов на лету было отклонено или отложено, поэтому единственное, что вы можете сделать, это заменить их новыми файловыми объектами, обернутыми вокруг одного и того же дескриптора файла, который выглядит примерно так ( непроверенный на данный момент):

sys.stdout = open(sys.stdout.fileno(), 'w', encoding='utf-8', errors='surrogateescape')
sys.stderr = open(sys.stderr.fileno(), 'w', encoding='utf-8', errors='backslashescape')
sys.stdin = open(sys.stdin.fileno(), 'r', encoding='utf-8', errors='surrogateescape')

Если вы уже напечатали что-нибудь в stdout или набрали/написали что-нибудь в stdin, вам может понадобиться сначала flush все.

Единственная оставшаяся проблема, о которой я знаю, - это то, что sys.argv и os.environ (по крайней мере, в Unix) уже были декодированы с неправильной кодировкой. Вы можете исправить аргументы путем перекодирования и повторного кодирования перед установкой кодировок по умолчанию. Я думаю, что это использует настройки локали, поэтому он будет выглядеть так:

sys.argv = [arg.encode(locale.getpreferredencoding(), errors='surrogateescape').decode('utf8', errors='surrogateescape') for arg in sys.argv]

Фиксирование среды немного сложнее, потому что если вы попытаетесь os.environ он собирается сделать вызов putenv который вам не нужен. Если это проблема, лучшим вариантом является, вероятно, сделать перекодированную копию environ и использовать ее для поиска и явно передать ее подпроцессу и т.д.

  • 0
    «не проверять их позже» - за исключением PYTHONINSPECT, который специально проверяется снова в конце программы. Я считаю, что это единственный особый случай.
  • 0
    @ user2357112 Хорошо, правда. И, вероятно, любые будущие переменные среды, которые можно будет с пользой установить после запуска, будут иметь похожую заметку: «Эта переменная также может быть изменена кодом Python с использованием os.environ …»
1

Вы можете технически установить его с помощью os.environ["PYTHONUTF8"] = "on" (значение не имеет значения), но это не повлияет на исполняемый скрипт. Когда вы это сделаете в скрипте Python, Python уже запустил и проверил эту переменную, не нашел его и, следовательно, по умолчанию не использует кодировку UTF-8. Однако это повлияло бы на любой интерпретатор Python, который вы запускали из вашего скрипта.

Точка переменной окружения должна установить ее перед запуском скрипта Python. Вы делаете это так же, как и для любой другой переменной среды. Вы не указываете, какую ОС вы используете, но в Linux вы обычно добавляете соответствующую команду в ~/.bash_profile. В Windows вы устанавливаете их с помощью кнопки на странице "Дополнительно" диалогового окна "Свойства системы".

Очевидно, вы не найдете эту переменную окружения в системном списке переменных среды, если вы еще не установили ее.

1

Обычно вы указываете это с аргументом командной строки

python3.7 -X utf8

Если вы хотите включить режим UTF-8 из переменной среды:

export PYTHONUTF8=1  # linux / macOS
set PYTHONUTF8=1  # windows

Он должен быть установлен перед входом в среду выполнения Python.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню