首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PYTHONUTF8中将环境变量设置为默认启用UTF8编码?

如何在PYTHONUTF8中将环境变量设置为默认启用UTF8编码?
EN

Stack Overflow用户
提问于 2018-06-20 00:39:53
回答 4查看 5.2K关注 0票数 5

Python3.7引入了PYTHONUTF8环境变量来默认启用UTF8编码。如何在Python程序中设置此变量?(我在操作系统的环境变量列表中找不到它。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-20 00:56:21

要访问环境变量,并在您的平台允许的情况下对其进行修改( Windows和所有流行的Unixes都会这样做),只需使用os.environ..。

但是,这不会有任何好处,除非您尝试为要启动的Python子进程设置环境变量subprocess或者类似的东西。Python在启动时读取它的环境变量,使用它们来获取配置信息,并且以后不会再次检查它们。


这些环境变量(和命令行标志)的目的是在shell、启动器脚本等中设置它们,以便在Python启动时可以使用它们,而不是从Python内部设置它们。

通常情况下,如果你需要这个设置,你会需要它的全局,所以你会想要在你的shell配置文件脚本(对于Linux),你的操作系统的环境变量的GUI (对于Windows),或者两者都设置(对于macOS-尽管在Mac上,一切都已经保证被设置为UTF-8,我相信即使你设法打破了它,Python也会忽略它)。(对于macOS-尽管在Mac上,一切都已经保证被设置为UTF-8,我相信即使你设法打破了它,Python也会忽略它)。

您不会在现有的环境变量列表中找到它(除非您使用的是一个不寻常的Linux发行版,它对区域设置做了一些奇怪的操作,但需要默认的Python来忽略它们),但这并不重要;您可以添加任何想要的环境变量。


但是,如果您想要动态更改某些内容,虽然您不能通过设置环境变量来实现,但您也不需要这样做。

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

前两个,您只需在中调用相同的函数syslocale随时设置它们。

如果你还想改变stdio文件,那就有点棘手了。我相信让动态更改这些文件的编码变得更容易的建议被拒绝或推迟了,所以你唯一能做的就是用包装在相同文件描述符周围的新文件对象来替换它们,它看起来像这样(目前还没有测试):

代码语言:javascript
复制
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.argvos.environ

将(至少在Unix上)已经用错误的编码进行了解码。在设置默认编码之前,您可以通过重新编码和重新解码来修复args。我认为这使用了区域设置,所以它看起来应该是这样的:

代码语言:js
复制
sys.argv = [arg.encode(locale.getpreferredencoding(), errors='surrogateescape').decode('utf8', errors='surrogateescape') for arg in sys.argv]

修复环境有点棘手,因为如果您尝试变异os.environ它将做一个putenv

那就叫你不想要的吧。如果这是一个问题,最好的选择可能是制作一个转码副本environ并将其用于查找,并显式地将其传递给子进程,等等。

票数 3
EN

Stack Overflow用户

发布于 2018-06-20 00:48:58

通常,您可以使用命令行参数来指定这一点

代码语言:js
复制
python3.7 -X utf8

如果要从环境变量启用UTF-8模式:

代码语言:javascript
复制
export PYTHONUTF8=1  # linux / macOS
set PYTHONUTF8=1  # windows

它应该被设置之前进入Python运行时。

票数 3
EN

Stack Overflow用户

发布于 2018-06-20 00:51:59

您可以使用以下命令从技术上设置它os.environ["PYTHONUTF8"] = "on"

(值并不重要),但这不会影响正在运行的脚本。当您在Python脚本中执行此操作时,Python已经启动并检查了这个变量,但没有找到它,因此默认情况下没有使用UTF-8编码。不过,它会影响您从脚本启动的任何Python解释器。

环境变量的要点是设置它之前启动Python脚本。执行此操作的方式与设置任何其他环境变量的方式相同。您没有提到您使用的是什么操作系统,但是在Linux上,您通常会将适当的命令添加到~/.bash_profile..。在Windows上,您可以使用系统属性对话框的高级页面上的按钮来设置它们。

显然,如果您还没有设置这个环境变量,那么您将无法在系统的环境变量列表中找到它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50933194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档