Ошибка Pyinstaller ImportError: нет модуля с именем 'requests.packages.chardet.sys

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

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

Короче говоря, script работает потрясающе, когда вызывается интерпретатором 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)

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

(EDIT Имея проблемы с вводом вывода, вот пастебин) pastebin

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

ПРИМЕЧАНИЕ. Я установил распространяемый ms С++ 2008, чтобы помочь очистить файл msvcr90.dll, но я все равно получаю вышеуказанную ошибку request.packages.chardet.sys.

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

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

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

Ответ 1

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

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

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

Ответ 2

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

pip install requests --upgrade

Легко.

Ответ 3

Как говорит 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 

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

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

Ответ 4

Я получил несколько ошибок при запуске моего исполняемого файла на python (например, "ни один модуль не назвал запросы", "нет модуля с именем cv2",...) и решил это, обновив setuptools:

pip install setuptools --upgrade

Ответ 5

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

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

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