如何在Python中默认设置PYTHONUTF8环境变量以启用UTF-8编码?

世界初恋

Python 3.7引入了PYTHONUTF8环境变量,默认情况下启用UTF-8编码。如何在Python程序中设置此变量?(我在操作系统的环境变量列表中找不到它。)

阿巴内特

要访问环境变量,并在平台允许的情况下修改它们(Windows和所有流行的Unix都允许),只需使用即可os.environ

但是,这将无济于事,除非您试图为启动时使用的Python子进程等设置环境变量subprocessPython在启动时读取其环境变量,使用它们来获取配置信息,并且以后不再进行检查。


这些环境变量(和命令行标志)的重点是在您的shell,启动脚本等中进行设置,因此在Python启动时就可以使用它们,而不是在Python内部进行设置。

通常,如果需要此设置,则将需要全局设置,因此需要在外壳配置文件脚本(对于Linux),操作系统的GUI的环境变量(对于Windows)或两者(对于Windows)中进行设置。 macOS-尽管在Mac上已经保证将所有内容都设置为UTF-8,但我相信即使您设法以某种方式打破该限制,Python也会忽略它)。

您不会在现有的环境变量列表中找到它(除非您可能是在不寻常的Linux发行版中,该发行版与语言环境设置有些奇怪,但是需要使用默认的Python来忽略它们),但这没关系; 您可以添加所需的任何环境变量。


但是,如果您想即时进行更改,尽管无法通过设置环境变量来做到这一点,那么您也不需要这样做。

正如文档所解释的,它所控制的是设置文件系统编码,首选编码和stdio文件编码。

前两个,您可以随时在中调用相同的函数syslocale进行设置。

如果您还想更改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上)已经使用错误的编码进行了解码。您可以在设置默认编码之前通过重新编码和重新编码来修复args。我认为这使用语言环境设置,因此如下所示:

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

修复环境有些棘手,因为如果您尝试突变,os.environ它将进行putenv您不想要呼叫。如果这是一个问题,最好的选择可能是对其进行转码后的副本environ并将其用于查找,然后将其显式传递给子流程,依此类推。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章