为什么PyDev / Jython下的sys.stdin.encoding与独立的Jython控制台不同?

时间:2012-03-11 02:14:28

标签: jython pydev

我试图在Eclipse下的PyDev下让python-gnupg在Jython中工作。有一个问题似乎是由sys.stdin.encoding引起的,它在初始化时由python-gnupg测试。

我发现以下脚本

import sys
print sys.stdin.encoding
当我从控制台中的Python独立程序和控制台中的Jython独立程序运行时,

outptus cp850。当我在Python的PyDev下运行它,它输出Cp1252,并且当我在Jython中的PyDev下运行它,我得到None

综观蟒-gnupg的,既编码cp850Cp1252似乎是好的,但如果它是None,它提出了一个异常:

File "C:\Python27\lib\site-packages\gnupg.py", line 487, in __init__
  self._collect_output(p, result, stdin=p.stdin)
File "C:\Python27\lib\site-packages\gnupg.py", line 561, in _collect_output
  stderr = codecs.getreader(self.encoding)(process.stderr)
File "C:\jython2.5.2\Lib\codecs.py", line 920, in getreader
  return lookup(encoding).streamreader
at org.python.core.codecs.normalizestring(codecs.java:101)
at org.python.core.codecs.lookup(codecs.java:75)
at org.python.modules._codecs.lookup(_codecs.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.NullPointerException: java.lang.NullPointerException

看起来PyDev和独立编码之间存在差异,以及PyDev / Jython没有(?)编码?我真的想使用便利的PyDev开发环境,但我怎么能得到的sys.stdin.encoding开发Jython的程序时要的东西合理?

更新1

可能问题与以下Jython错误报告之一有关:

但话说回来,这些似乎与PyDev / Eclipse无关。?

2 个答案:

答案 0 :(得分:2)

这实际上是一个Jython问题:

在PySystemState.java中,当设置编码时,如果Jython不是tty控制台,它将跳过设置任何编码:

private void initEncoding() {
    String encoding = registry.getProperty(PYTHON_CONSOLE_ENCODING);
    if (encoding == null) {
        return;
    }

    for (PyFile stdStream : new PyFile[] {(PyFile)this.stdin, (PyFile)this.stdout,
                                          (PyFile)this.stderr}) {
        if (stdStream.isatty()) {
            stdStream.encoding = encoding;
        }
    }
}

所以,一个解决方法可能是创建一个java模块来设置它(因为编码是PyFile的公共字段,但是没有来自Jython端的setter - 或者你可以使用java反射来设置它)。

也许你可以问一下Jython家伙为什么会这样做(我认为编码可以设置,即使它不是一个tty设备,但我不确定它有什么含义以及它为什么会这样做那样)。

编辑总结了许多comments below的结果,Jython和PyDev的开发人员以及原始问题的作者(Philip Jenvey,Fabio Zadrozny和Christian Gelinek,resp 。):

在进展过程中,讨论并开发了几个测试脚本:

  • 由Philip编写的Python unit test来测试由最小自定义创建的 sitecusomize.py 脚本设置的不同编码。 Fabio thinks,它实际上没有设置编码的原因是因为 sys.stdin.encoding 是从父进程继承的,而是由单元测试脚本配置的。
  • 由Christian编写的
  • A Java test program设置用于创建Python子流程的自定义I / O流,Fabio发现它是more similar PyDev如何设置子流程。

由于Fabio没有按预期工作,他remembered PyDev也使用PYTHONIOENCODING环境变量。

正如Philip所指出的,当前(2.5)版本的Jython不支持PYTHONIOENCODING环境变量,PyDev使用该环境变量(与 sitecusomize.py 结合使用) )设置编码:

  

你可以为它记录一个bug,虽然PYTHONIOENCODING只在CPython 2.6中添加,所以Jython可能不会支持它,直到2.7(Jython跳过2.6)。

答案 1 :(得分:0)

我相信你应该能够在启动属性上显式编码。

运行配置 - > Python运行 - > Xxx - >常用标签 - >编码

PyDev从全局Eclipse设置继承了一些设置。在Linux上,编码在任何地方都是理智的UTF-8,但是一些不稳定的操作系统会导致他们自己的问题。

此外,您可以检测.py主模块中的编码,并使用PyDev特定的hack来修复与您的配置相关的问题。