Почему бы не использовать патч sys.getfilesystemencoding() для обезьян?

В Python можно прочитать кодировку файловой системы с помощью sys.getfilesystemencoding().

Но, похоже, нет официального способа установить кодировку файловой системы.

См.: Как изменить кодировку файловой системы с помощью python?

Я нашел этот грязный хак:

import sys
sys.getfilesystemencoding = lambda: 'UTF-8'

Есть ли лучшее решение, если изменение переменной среды LANG перед запуском интерпретатора невозможно?

Фон, почему я хочу этого:

Это работает:

user@host:~$ python src/setfilesystemencoding.py 
LANG: de_DE.UTF-8
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): UTF-8

Это не работает:

user@host:~$ LANG=C python src/setfilesystemencoding.py 
LANG: C
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): ANSI_X3.4-1968
Traceback (most recent call last):
  File "src/setfilesystemencoding.py", line 10, in <module>
    with open('/tmp/german-umlauts-üöä', 'wb') as fd:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-22: ordinal not in range(128)

Вот простой скрипт:

# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals, print_function

import os, sys

print('LANG: {}'.format(os.environ['LANG']))
print('sys.getdefaultencoding(): {}'.format(sys.getdefaultencoding()))
print('sys.getfilesystemencoding(): {}'.format(sys.getfilesystemencoding()))

with open('/tmp/german-umlauts-üöä', 'wb') as fd:
    fd.write('foo')

Я надеялся, что описанное выше исправление обезьяны решит эту проблему ... но это не так. Извините, этот вопрос больше не имеет смысла. Я закрываю его.

Мое решение: используйте LANG=C.UTF-8


person guettli    schedule 07.12.2017    source источник
comment
Хм, принятый ответ на указанный вопрос объясняет, почему вы даже не должны пытаться установить кодировку файловой системы. В чем твоя настоящая проблема?   -  person Serge Ballesta    schedule 07.12.2017
comment
@SergeBallesta Я обновил вопрос и объяснил свой опыт.   -  person guettli    schedule 07.12.2017
comment
Вы ничего не объяснили. В частности, я не вижу ни реальной проблемы, ни реального примера изменения кодировки файловой системы ни в одном из двух упомянутых постов, только плохое сочетание юникодных и байтовых строк. Еще раз, в чем ваша настоящая проблема?   -  person Serge Ballesta    schedule 07.12.2017
comment
@SergeBallesta Хотя изменение кодировки файловой системы - это решение. Но это не так. Кажется, во время запуска интерпретатора происходит какое-то волшебство, которое нельзя изменить позже. Я до сих пор не понял, почему нельзя изменить это значение во время выполнения. Я мог бы решить свою проблему, используя LANG=C.UTF-8 вместо LANG=C.   -  person guettli    schedule 11.12.2017