В Python 3.7 была введена переменная среды PYTHONUTF8, позволяющая по умолчанию кодировать UTF-8. Как установить эту переменную из программы Python? (Я не могу найти его в списке операционных систем переменных среды).
Чтобы получить доступ к переменным окружения и изменить их, если ваша платформа позволяет это (что делает 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
и использовать ее для поиска и явно передать ее подпроцессу и т.д.
Вы можете технически установить его с помощью os.environ["PYTHONUTF8"] = "on"
(значение не имеет значения), но это не повлияет на исполняемый скрипт. Когда вы это сделаете в скрипте Python, Python уже запустил и проверил эту переменную, не нашел его и, следовательно, по умолчанию не использует кодировку UTF-8. Однако это повлияло бы на любой интерпретатор Python, который вы запускали из вашего скрипта.
Точка переменной окружения должна установить ее перед запуском скрипта Python. Вы делаете это так же, как и для любой другой переменной среды. Вы не указываете, какую ОС вы используете, но в Linux вы обычно добавляете соответствующую команду в ~/.bash_profile
. В Windows вы устанавливаете их с помощью кнопки на странице "Дополнительно" диалогового окна "Свойства системы".
Очевидно, вы не найдете эту переменную окружения в системном списке переменных среды, если вы еще не установили ее.
Обычно вы указываете это с аргументом командной строки
python3.7 -X utf8
Если вы хотите включить режим UTF-8 из переменной среды:
export PYTHONUTF8=1 # linux / macOS
set PYTHONUTF8=1 # windows
Он должен быть установлен перед входом в среду выполнения Python.
os.environ
…»