UnicodeDecodeError в SUDS, но только в .exe, сгенерированном py2exe - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть скрипт Python 2.7 SendPreord.py , который взаимодействует с веб-сервисами с использованием SUDS .В скрипте я вызываю метод веб-сервиса, передавая некоторые параметры в виде строк (runJob(par1, par2, par3)).Хорошо работает с западноевропейскими символами в строках.Я запускаю его в Eclipse с PyDev .

Затем я генерирую .exe , используя py2exe .Теперь он дает мне ошибку

Traceback (most recent call last):
  File "SendPreord.py", line 80, in <module>
  File "suds\client.pyc", line 542, in __call__
  File "suds\client.pyc", line 602, in invoke
  File "suds\client.pyc", line 637, in send
  File "suds\transport\https.pyc", line 64, in send
  File "suds\transport\http.pyc", line 77, in send
  File "suds\transport\http.pyc", line 118, in u2open
  File "urllib2.pyc", line 391, in open
  File "urllib2.pyc", line 409, in _open
  File "urllib2.pyc", line 369, in _call_chain
  File "urllib2.pyc", line 1173, in http_open
  File "urllib2.pyc", line 1142, in do_open
  File "httplib.pyc", line 946, in request
  File "httplib.pyc", line 987, in _send_request
  File "httplib.pyc", line 940, in endheaders
  File "httplib.pyc", line 801, in _send_output
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 484: ordinal not in range(128)

Код, вызывающий ошибку:

result = ws_client.service.runJob(par1, par2, par3)

В процессе расследования я понял, что удаление символов, таких как °èòà, решает проблему ... но яне могу!Я должен сохранить строки, которые я передаю.

Поэтому я попытался декодировать строки перед их передачей:

result = ws_client.service.runJob(par1.decode('latin9'), par2.decode('latin9'), par3.decode('latin9'))

Опять все работает в .py, но не в .exe .Может быть, PyDev как-то исправляет проблему?


ATTACHMENTS

Setup.py:

from distutils.core import setup
import py2exe
setup(console=['src/SendPreord.py'])

Интересные выдержки из выходного журнала py2exe:

*** copy dlls ***
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\xxxxxxx\workspace\eclipse\SendPreord\dist\SendPreord.exe
The following modules appear to be missing
['ElementC14N', '_scproxy', 'ntlm']

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   USER32.dll - C:\Windows\system32\USER32.dll
   SHELL32.dll - C:\Windows\system32\SHELL32.dll
   WSOCK32.dll - C:\Windows\system32\WSOCK32.dll
   ADVAPI32.dll - C:\Windows\system32\ADVAPI32.dll
   WS2_32.dll - C:\Windows\system32\WS2_32.dll
   KERNEL32.dll - C:\Windows\system32\KERNEL32.dll

1 Ответ

0 голосов
/ 08 сентября 2011

Вас укусило предположение Python о преобразованиях кодировки.Первая часть, которую вы попробовали, верна: сначала расшифруйте с помощью (надеюсь правильной) кодировки.Прежде чем отправить его, вы должны снова его кодировать, желательно используя что-то вроде UTF-8, иначе Python попытается использовать кодировку «по умолчанию» (которая используется в большинстве установок ASCII). Я уже писал здесь раньше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...