【问题标题】:How do I change the environment variable LANG from within a Python script?如何从 Python 脚本中更改环境变量 LANG?
【发布时间】:2017-07-25 00:13:30
【问题描述】:

我正在用 python 编写一个脚本,该脚本生成包含 utf-8 字符的输出,尽管大多数 linux 终端默认使用 utf-8,但我正在编写代码,假设它不在 utf-8 中(以防用户出于某种原因更改了它)。

根据我的测试,os.environ["LANG"] = "en_US.utf-8" 不会改变系统环境变量,它只会改变 Python 内部的数据结构。

【问题讨论】:

  • 你为什么不只是.encode(sys.stdout.encoding)你的Unicode输出?否则,请参阅man 5 locale;基本上你需要设置一个环境变量然后运行你的程序。
  • 其实用LANG=en_US.utf-8可以解决,但是由于某种原因我不能和os.system("LANG=en_US.utf-8")subprocess.call("LANG=en_US.utf-8", shell=True)或者subprocess.Popen("LANG=en_US.utf-8", shell=True)一起使用
  • 这是因为它不是可执行文件! Pass env to Popen instead.
  • 你是对的。 LANG 实际上是一个环境变量,我试图从 Python 脚本中更改它的值。我尝试使用env 作为Popen() 的参数。它返回0。我重新表述了这个问题及其细节,以澄清我需要什么。
  • subprocess.call("export LANG=en_US.utf-8", shell=True) 会启动一个子进程,给子进程设置环境,然后杀死子进程。它不会产生任何影响 - 您不能从子进程更改环境。

标签: python linux encoding utf-8


【解决方案1】:

我认为你做得过火了。 Python 随附电池;只需使用它们。

正确配置的终端会话设置了LANG 环境变量;它描述了终端期望从该会话中运行的程序输出的编码。

Python解释器检测到这个设置并根据它设置sys.stdout.encoding。然后它使用该编码将任何 Unicode 输出编码为正确的字节序列。 (如果您要发送一个字节序列,那么您就得靠自己了,并且可能知道自己在做什么;也许您发送的是二进制流,而不是文本。)

因此,如果您将文本输出为 Unicode,它必须自动正确显示,前提是所有字符都可以编码。

如果您需要更精细的控制,请选择输出编码,使用您自己的错误处理进行编码,然后输出字节。

从事更改终端会话设置的业务,除非您正在编写专门用于执行此操作的工具。用户已配置会话;如果它是一个表现良好的程序,你的程序必须适应这个配置,而不是改变它。

【讨论】:

    【解决方案2】:

    当您更改 LANG 环境时,不清楚您希望看到什么。如果您想用其他字符编码测试您的 Python 代码,则需要在启动 Python 代码之前设置 LANG,因为我相信当 Python 首次启动时会读取 LANG。

    可能(?)有一个函数调用可以在 Python 启动后调用以更改 LANG,但是如果这是出于测试目的,我建议在运行 Python 代码之前设置它。

    然而,更好的方法是更改​​终端程序中的 LANG。使其具有正确的编码。虽然几乎每个人都应该使用 UTF8,所以我不确定您是否需要再测试非 UTF8。

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 2013-01-24
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2018-07-05
      相关资源
      最近更新 更多