为什么我有一个 "locale error" 运行 一个从 Mac 复制的 jython 脚本?

Why do I have a "locale error" running a jython script which was copied from a Mac?

我有一个 python 框架,用于配置我们的 "virtual" 测试系统。这些测试系统 运行 一些基于 RH Linux;在每个系统上,都有一个特定的 JVM 运行.

现在我遇到了这个奇怪的问题:

  1. 我的 python 框架将一个小的 X.py 脚本复制到远程系统(使用 scp)
  2. 我的 python 框架然后使用 ssh 来触发我们特殊的 "jython" 包装器...在远程 system/JVM[的上下文中简单地加载和执行上述 X.py

如果我的框架 运行 在...上的系统是某种 Linux(Ubuntu 或 RedHat)...一切正常。

但现在我第一次 "Mac user" 使用我的框架。当他 运行 我的框架本地在他的 Mac 上时,他得到这个远程调用 jython 的错误输出:

b'Traceback (most recent call last):'
b'  File "xxxjython", line 19, in <module>'
b'    xxxjython.main()'
b'  File "xxxjython.py", line 296, in main'
b"    locale.setlocale(locale.LC_ALL, '')       # Read env var to initialize locale info"
b'  File "/usr/lib/python2.6/locale.py", line 513, in setlocale'
b'    return _setlocale(category, locale)'
b'locale.Error: unsupported locale setting'

我们可以通过 运行 这里 fix/workaround 这个问题

echo 'export LC_ALL=en_US.UTF-8' >>/etc/bashrc

首先在远程系统上。但我仍然很困惑——为什么我需要在远程系统上导出这个文件;如果唯一的区别(与 "working" 设置相比)是系统的 OS,而我的 "master framework" 是 运行?

最后我发现这与"locales"如何与远程系统协同工作有关。有关更多信息,请参见 here.

我的解决方案是设置

os.environ["LC_ALL"] = "C"

在我的框架内。这 "overrides" 所有语言环境设置;它从 python 流入我的 ssh 调用到远程 jython 调用。