LookupError: неизвестная кодировка: idna — только из subprocess.call

Я пытаюсь вызвать скрипт Python 2.7 из Iron Python, используя subprocess.call. вызванный процесс использует импорт, который не поддерживается в IronPython, например scikit-learn и requests.

В настоящее время я пытаюсь вызвать скрипт Python 2.7 с помощью этой команды:

sub_ret_val = subprocess.call("C:/Documents and Settings/avishay/workspace/BursaProject_V1_31/brainManager_toFile.py", shell = True, stderr = subprocess.STDOUT)

но я получаю:

LookupError: неизвестная кодировка: idna

теперь этот скрипт отлично работает, если я запускаю его из оболочки Windows или из среды eclipse pydev. в чем разница между запуском из оболочки и запуском из subprocess.call, что приводит к сбою??

Спасибо

---РЕДАКТИРОВАТЬ---

Кажется, я тоже не могу импортировать encodings.idna:

ImportError: Нет модуля с именем idna

что очень-очень странно... печать sys.path показывает, что c:\\Python27\\Lib есть, а файл idna.py находится в каталоге кодировок... как может не работать импорт???

--- ЕЩЕ ОДНА РЕДАКТИРОВАТЬ ---

Я нашел один способ обойти проблему - запустить скрипт IronPython из оболочки python - и все работает нормально. Я до сих пор понятия не имею, почему вызов интерпретатора python 2.7 из IronPython мешает внутренним модулям python 2.7... PYTHONPATH включает путь к этим модулям, поэтому я был бы очень признателен за любое понимание того, что происходит под капотом.


person WeaselFox    schedule 25.04.2013    source источник
comment
создайте полный минимальный пример кода, который показывает проблему, и опубликуйте полную трассировку, например, поместите print u'abc'.encode('idna') в файл child.py и вызовите его из parent.py: import subprocess; subprocess.call([r'c:\Python27\python.exe', 'child.py']). Сначала запустите parent.py с помощью CPython (чтобы убедиться, что он работает должным образом), затем запустите parent.py с помощью IronPython и посмотрите, воспроизводит ли он проблему.   -  person jfs    schedule 25.04.2013
comment
@ J.F.Sebastian - я не могу воспроизвести ошибку так, как вы предложили. Он отлично работает при запуске parent.py с IronPython...   -  person WeaselFox    schedule 26.04.2013
comment
Это означает, что CPython 2.7 прекрасно находит кодировку idna. Что произойдет, если вы вызовете brainManager_toFile.py из parent.py вместо child.py?   -  person jfs    schedule 26.04.2013
comment
хм... тоже работает. кажется, единственная проблема заключается в запуске его из eclipse. до сих пор не уверен, почему, но я собираюсь отпустить это .. Спасибо   -  person WeaselFox    schedule 27.04.2013


Ответы (1)


IronPython не поддерживает кодировку idna, которая, вероятно, используется requests модулем.

Кодировка idna доступна, начиная с Python 2.3:

>>> u"яндекс.рф".encode('idna')
b'xn--d1acpjx3f.xn--p1ai'
>>> b'xn--d1acpjx3f.xn--p1ai'.decode('idna')
'яндекс.рф'

Чтобы избежать двусмысленности в отношении того, какой python используется для запуска вашего скрипта, попробуйте явно указать путь к исполняемому файлу Python:

from subprocess import STDOUT, check_output as qx

output = qx([r"c:\Python27\python.exe", r"c:\path\to\script.py"], stderr=STDOUT)

В качестве альтернативы вы можете установить pylauncher, чтобы указать желаемую версию Python для скрипта Python. в своей строке shebang, например, #!python2.7.

person jfs    schedule 25.04.2013
comment
Спасибо за ваш ответ. Я пытался явно указать исполняемый файл, но безрезультатно. Я не понимаю, почему запуск из IronPython должен заставить python 2.7 не находить idna внутри своей папки /Lib/encodings. - person WeaselFox; 25.04.2013