Почему sys.stdin.encoding под PyDev / Jython отличается от автономной консоли Jython? - PullRequest
2 голосов
/ 11 марта 2012

Я пытаюсь заставить python-gnupg работать в Jython под PyDev под Eclipse. Существует проблема, которая, кажется, вызвана sys.stdin.encoding, который тестируется python-gnupg при его инициализации.

Я обнаружил, что следующий скрипт

import sys
print sys.stdin.encoding

outptus cp850, когда я запускаю его из автономного Python в консоли и из автономного Jython в консоли. Когда я запускаю его в Python под PyDev, он выводит Cp1252, а когда я запускаю его в Jython под PyDev, я получаю None.

Глядя на python-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 ..?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

На самом деле это проблема 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 - или вы можете использовать Java-отражение, чтобы установить его) ...

Может быть, вы могли бы спросить ребят из Jython, почему это сделано в первую очередь (я думаю, что кодировка может быть установлена, даже если это не tty-устройство, но я не уверен, какие последствия это может иметь и почему это сделано).путь).

РЕДАКТИРОВАТЬ, чтобы суммировать результаты многочисленных комментариев ниже , между разработчиками Jython и PyDev, а также автора оригинального вопроса (Филип Дженви, ФабиоЗадрозный и Кристиан Гелинек * (1014 *, соотв.):

В ходе работы была обсуждена и разработана пара тестовых сценариев:

  • A Python unон тестирует , написанную Филиппом, для тестирования различных кодировок, установленных минимально настраиваемыми sitecusomize.py скриптами.Фабио считает , что причина, по которой он не устанавливает кодировку, заключается в том, что sys.stdin.encoding наследуется от родительского процесса, а не настраивается скриптом модульного теста.
  • Тестовая программа Java , написанная Кристианом, которая настраивает пользовательские потоки ввода / вывода для создания подпроцесса Python, который, по мнению Фабио, больше похож на то, как PyDev настраивает подпроцесс..

Поскольку это не сработало, как ожидал Фабио, он вспомнил , что PyDev также использует переменную окружения PYTHONIOENCODING.

Как было указаноПо словам Филиппа, текущая (2.5) версия Jython не поддерживает переменную окружения PYTHONIOENCODING, которая используется PyDev (в сочетании с sitecusomize.py ) для установки кодировки:

Вы можете зарегистрировать ошибку, хотя PYTHONIOENCODING был добавлен только в CPython 2.6, поэтому Jython, вероятно, не будет поддерживать его до 2.7 (пропуск Jython 2.6).

0 голосов
/ 11 марта 2012

Я считаю, что вы должны иметь возможность явного кодирования в свойствах запуска.

Запуск конфигураций -> Запуск Python -> Xxx -> Вкладка Common -> Кодировка.

PyDev наследует некоторые настройкииз глобальных настроек Eclipse.В Linux кодировка UTF-8 везде нормальна, но некоторые капризные операционные системы вызывают свои собственные проблемы.

Также вы, вероятно, можете обнаружить кодировку в главном модуле .py и иметь специальный взлом PyDev для решения проблем, связанных сваша конфигурация.

...