2015-02-27 2 views
11

Я не могу найти основную причину этого. Я не знаю, если это pyinstaller, проблема с пипсом, модуль запросов или что-то еще, так как ничто не может быть окончательно устранено.Ошибка Pyinstaller ImportError: Нет модуля с именем 'requests.packages.chardet.sys

Я написал сценарий на python, который правильно конфигурирует новый аппаратный sonicwall для нашей корпоративной сети, когда нам нужно развернуть новый блок. Он настраивает правильный .exp-файл в памяти, регистрируется в устройстве sonicwall с учетными данными по умолчанию, импортирует файл через форму данных с несколькими частями, перезапускает sonicwall, затем снова регистрируется и правильно изменяет общий секрет. По соображениям безопасности я не могу опубликовать код здесь, но я могу объяснить проблему более простым примером. Раньше код использовал urllib и urllib2 для обработки HTTP-запросов, но затем я обнаружил модуль запросов, когда мне пришлось перезаписать скрипт, чтобы включить csrfTokens.

Короче говоря, сценарий отлично работает при вызове интерпретатора python. Однако, пытаясь скомпилировать его с помощью pyinstaller, теперь я получаю серию ошибок, когда я переключился на запросы вместо urllib.

Некоторые более фона:

Windows 7 - Python2.7.9 
pip 6.0.8 from C:\Python27\lib\site-packages\pip-6.0.8-py2.7.egg (python 2.7) 
pip freeze output: 
pyinstaller==2.1.1.dev0 
pywin32==219 
requests==2.5.3 

В качестве примера, я дам вам код, бомбы из, простой запрос к Google.

#!/usr/bin/python 
import requests 
r = requests.get('https://google.com') 
print(r.text) 

Приведенный выше код работает для простого запроса, когда я называю файл из питона, но когда я скомпилировать его, я получаю это:

(EDIT Возникли проблемы оклейки выход, вот Pastebin) pastebin

это создает окна исполняемый файл, но это следующая ошибка при попытке запустить его:

Примечание я установить MS C++ 2008 redistributa чтобы помочь очистить файл msvcr90.dll, но я все равно получаю вышеуказанную ошибку request.packages.chardet.sys.

Я пробовал все, о чем я могу думать, устанавливая чарт, устанавливая chardet2, устанавливая cchardet, заставляя более ранние версии pyinstaller и запрашивая постепенно. Ломать пипетку и вручную устанавливать pyinstaler и запросы. Я нахожусь на своем пути, чтобы попытаться, я не совсем понял ошибку здесь. В системе существует request.packages.chardet. У меня также есть C: \ Python27 в моих Windows PATH, поскольку я могу вызвать python из любого каталога.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Я старался быть настолько тщательным с ошибками, насколько это возможно, и тем, что я установил, но при необходимости я могу предоставить больше.

ТАКЖЕ Эта проблема ТОЛЬКО появляется, когда я пытаюсь скомпилировать, когда я импортирую запросы. создание тестовых скриптов, beautifulsoup, urllib/2 и т. д. все компилируют корректные окна exe, которые работают правильно.

+0

Похоже на https://www.mail-archive.com/[email protected]/msg00374.html и http://comments.gmane.org/gmane.comp.python.pyinstaller/3281 –

ответ

9

У меня пока нет решения, но это вызвано последними изменениями в модуле requests (версии 2.5.2 & 2.5.3).

Теперь вы можете использовать версию 2.5.1 до тех пор, пока PyInstaller не найдет подходящий крючок для решения этой проблемы.

Я не могу объяснить этот вопрос, но, похоже, что есть какое-то столкновение между PyInstaller импортными крючками и некоторыми последними дополнениями к requests (VendorAlias).

+0

.. . Благодаря! Вы только что ответили вчера, и сегодня я получил ошибку. Потрясающие! – swdev

+0

m1keil, вы только что спасли то, что осталось от волос на моей голове! Я вытягивал свои волосы из-за этой проблемы и заставлял запросы 2.5.1 разрешать это! Перед тем, как я разместил здесь, я также разместил на трекере проблемы github запросов, поэтому он знает об этом. Я связал эту тему с его трекером. Но так я понимаю, мы не думаем, что это обязательно все запросы, или pyinstaller, просто кажется, что они делают что-то по-другому и сталкиваются с конфликтами с импортными крючками и новым дополнением к запросам? –

+0

Да, это именно то, что я думаю. Проблема с такими вещами, как PyInstaller, py2exe и т. Д., Заключается в том, что базовый модуль Python должен быть «осведомлен», что иногда работает в «замороженном» состоянии. Похоже, это точно так. – m1keil

-1

Я думаю, что проблема решена в версии Setuptools, поэтому попробуйте использовать более старую версию и протестируйте ее снова. В моем случае это работает!

>> pip uninstall setuptools 
>> pip install setuptools==12.0.5 

Я думаю, проблема связана с интерпретацией позиционного аргумента

+1

Я пробовал это, и это не сработало для меня. –

1

Как m1keil говорит, что проблема находится между импортными крючками PyInstaller и новыми возможностями load_module запросов, реализованных в requests.packages.__init__.py исходном файле.

Отладка этого файла показывает, что любой импорт пакета запросов проходит через функцию load_module. Это включает стандартные пакеты python. Это причина ошибки.

Мой обходной путь заключается в редактировании requests.packages.__init__.py (внутри virtualenv папки) версии 2.5.3 и добавляя этот кусок кода в самом начале функции load_module:

print "Requested name = ", name #Comment this line when it works 
    direct_loaded_packages = ('sys', 'errno','logging','warnings' 
      ,'socket','os','re','time','hashlib','base64' 
      ,'time','collections','datetime','io', 'argparse' 
      ,'codecs', 'Queue', 'zlib', 'ssl', 'operator' 
      ,'types','platform','struct', 'StringIO','httplib' 
      ,'simplejson','cookielib','urllib','urlparse' 
      ,'urllib2','Cookie','http','binascii','certifi' 
      ,'uuid','json','threading','dummy_thread','email' 
      ,'email.utils','operator','mimetypes')  


    new_name = '' 
    #Package with three directory deep 
    if '.'.join(name.split('.')[3:]) in direct_loaded_packages: 
     new_name = '.'.join(name.split('.')[3:]) 
    #Package with four directory deep 
    elif '.'.join(name.split('.')[4:]) in direct_loaded_packages: 
     new_name = '.'.join(name.split('.')[4:]) 
    #Package with five directory deep 
    elif '.'.join(name.split('.')[5:]) in direct_loaded_packages: 
     new_name = '.'.join(name.split('.')[5:]) 

    if new_name != '': 
     module = __import__(new_name) 
     return module 

По тест & ошибки и grepping Я создал список пакетов, которые должны быть напрямую загружены без прохождения функцией load_module.

Не элегантный, но он работает. Я тестировал более элегантное решение, но мне это не удалось.

3

Хорошие новости, это было исправлено в последней версии requests

pip install requests --upgrade 

Easy.

Смежные вопросы