我试图在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的,既编码cp850
和Cp1252
似乎是好的,但如果它是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无关。?
答案 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 。):强>
在进展过程中,讨论并开发了几个测试脚本:
由于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来修复与您的配置相关的问题。