【问题标题】:Pyinstaller error ImportError: No module named 'requests.packages.chardet.sysPyinstaller 错误 ImportError: No module named 'requests.packages.chardet.sys
【发布时间】:2015-04-30 18:25:15
【问题描述】:

我似乎无法找到造成这种情况的根本原因。我不知道是 pyinstaller、pip 问题、requests 模块还是其他问题,因为什么都无法最终消除。

我在 python 中编写了一个脚本,当我们必须部署一个新单元时,它可以为我们的企业网络正确配置一个新的硬件 sonicwall。它在内存中配置适当的 .exp 文件,使用默认凭据登录到 sonicwall 设备,通过多部分数据表单导入文件,重新启动 sonicwall,然后再次登录并正确更改共享密钥。出于安全原因,我不能在这里发布代码,但我可以用一个更简单的例子来解释这个问题。之前的代码是使用 urllib 和 urllib2 来处理 http 请求,但是后来我不得不重新编写脚本以包含 csrfTokens 时发现了 requests 模块。

长话短说,当被 python 解释器调用时,脚本的效果非常好。但是,当尝试使用 pyinstaller 编译它时,由于我已切换到请求而不是 urllibs,因此出现了一系列错误。

更多背景:

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

作为一个例子,我会给你一些代码,一个简单的谷歌请求。

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

当我从 python 调用文件时,上面的代码适用于一个简单的请求,但是当我编译它时,我得到了这个:

(编辑在粘贴输出时遇到问题,这里是 pastebin) pastebin

它创建了一个 Windows 可执行文件,但是当我尝试运行它时出现以下错误:

注意我确实安装了 ms c++ 2008 可再发行组件以帮助清除 msvcr90.dll,但我仍然收到上述 requests.packages.chardet.sys 错误。

我已经尝试了所有我能想到的方法,安装 chardet,安装 chardet2,安装 cchardet,强制早期版本的 pyinstaller 和增量请求。报废 pip 并手动安装 pyinstaler 和请求。我对要尝试的事情束手无策,我并没有完全理解这里的错误。 requests.packages.chardet 存在于系统中。我的 Windows PATH 中也有 C:\Python27,因为我可以从任何目录调用 python。

如果您需要更多信息,请告诉我。我试图尽可能彻底地处理错误以及我安装的内容,但如果需要,我可以提供更多。

ALSO 仅当我在导入请求时尝试编译时才会出现此问题。创建测试脚本、beautifulsoup、urllib/2 等都会编译出一个可以正常运行的有效 windows exe。

【问题讨论】:

标签: python python-2.7 python-requests pyinstaller


【解决方案1】:

我在运行我的 python 可执行文件时遇到了一些错误(例如“没有名为请求的模块”、“没有名为 cv2 的模块”……)我通过升级 setuptools 解决了它:

pip install setuptools --upgrade

【讨论】:

    【解决方案2】:

    好消息,此问题已在最新版本的requests 中得到修复

    pip install requests --upgrade
    

    简单。

    【讨论】:

      【解决方案3】:

      正如 m1keil 所说,问题在于 PyInstaller 导入钩子和请求的新 load_module 功能之间,在 requests.packages.__init__.py 源文件中实现。

      调试这个文件,你可以看到请求包的任何导入都通过了 load_module 函数。这包括 python 标准包。这就是错误的原因。

      我的解决方法是编辑 2.5.3 版本的 requests.packages.__init__.py(在 virtualenv 文件夹中),并在 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 函数的包列表。

      并不优雅,但它有效。我测试了一个更优雅的解决方案,但没有成功。

      【讨论】:

        【解决方案4】:

        我认为问题出在 Setuptools 版本上,因此请尝试使用旧版本并再次测试。就我而言,它有效!

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

        我猜这个问题与位置参数的解释有关

        【讨论】:

          【解决方案5】:

          我还没有解决方案,但这是由 requests 模块(版本 2.5.2 和 2.5.3)中的最新更改引起的。

          现在你可以使用 2.5.1 版本,直到 PyInstaller 有合适的钩子来解决这个问题。

          我无法真正解释这个问题,但看起来PyInstaller 导入钩子和requests (VendorAlias) 的一些最新添加之间存在某种冲突。

          【讨论】:

          • ...谢谢!你昨天刚刚回答了这个问题,我今天得到了错误。太棒了!
          • m1keil,你刚刚拯救了我头上剩下的头发!我一直在努力解决这个问题并强制请求 2.5.1 解决了它!在我在这里发帖之前,我也在requests github issue tracker上发帖,所以他是知道的。我也将此线程链接到他的问题跟踪器。但据我所知,我们并不认为这一定是所有请求错误,或者 pyinstaller,只是似乎两者都在做不同的事情并与导入钩子和请求的新添加发生冲突?
          • 是的,这正是我的想法。 PyInstaller、py2exe 等问题是底层 Python 模块需要“意识到”有时它在“冻结”状态下运行。看起来确实如此。
          • 只是徘徊,是不是这样,解决方法会和导入zope.interface时出现扭曲导入错误一样吗? * 我不确定,我认为这是 PyInstaller 中所谓的假导入
          • @swdev,我个人不知道。我没有时间了解有关错误的太多详细信息,而且我对 zope 也不熟悉。
          猜你喜欢
          • 2017-11-04
          • 1970-01-01
          • 2020-03-21
          • 2018-11-11
          • 2015-02-27
          • 1970-01-01
          • 2022-08-23
          • 2017-03-16
          • 2013-08-20
          相关资源
          最近更新 更多