Ошибка Pyinstaller ImportError: нет модуля с именем " запросы.пакеты.chardet.системный

Я не могу найти основную причину этого. Я не знаю, является ли это pyinstaller, проблема pip, модуль запросов или что-то еще, поскольку ничто не может быть окончательно устранено.

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

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

еще немного фона:

Windows 7 - Python2.7.9
pip 6.0.8 from C:Python27libsite-packagespip-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)

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

(редактировать возникли проблемы с вставкой вывода, вот сайт Pastebin) сайт Pastebin

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

Примечание я установил распространяемый ms c++ 2008, чтобы помочь очистить msvcr90.dll, но я все равно получаю вышеуказанные запросы.пакеты.chardet.ошибку.

Я пробовал все, что мог придумать, устанавливая chardet, устанавливая chardet2, устанавливая cchardet, заставляя более ранние версии pyinstaller и запросы пошагово. Слом pip и ручная установка pyinstaler и запросов. Я в своем уме с вещами, чтобы попробовать,я не совсем понимаю ошибку здесь. запросы.пакеты.chardet существует в системе. У меня также есть C:Python27 в моем пути windows, как я могу вызвать python из любого каталога.

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

и эта проблема возникает только при попытке компиляции при импорте запросов. создание тестовых сценариев, beautifulsoup, urllib / 2 и т. д. Все компилируют допустимый exe-файл windows, который работает правильно.

4 ответов


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

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

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


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

pip install requests --upgrade

легко.


как 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 

С помощью test&error и grepping я построил список пакетов, которые должны быть непосредственно загружены без передачи функцией load_module.

- Это не элегантно, но это работает. Я протестировал более элегантное решение, но мне это не удалось.


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

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

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