【问题标题】:py2exe "requests" module missingpy2exe“请求”模块丢失
【发布时间】:2015-08-22 13:41:54
【问题描述】:

不知道为什么我无法导入包requests

如果我执行需要requests 库的脚本,它显然会崩溃。

请求库网络:
http://docs.python-requests.org/en/latest/

版本 Py2exe 0.9.2.2

版本 Python 3.4.3

我尝试使用 py2exe 的其他选项,例如 -i requests 我什至尝试使用 setup.py 表单,但我无法使其工作。

py -3.4 -m py2exe.build_exe script.py --bundle-files 3

  24 missing Modules
  ------------------
? Cookie                              imported from requests.compat
? OpenSSL                             imported from requests.packages.urllib3.contrib.pyopenssl
? Queue                               imported from requests.packages.urllib3.connectionpool
? _abcoll                             imported from requests.packages.urllib3.packages.ordered_dict
? backports                           imported from requests.packages.urllib3.packages.ssl_match_hostname
? certifi                             imported from requests.certs
? cookielib                           imported from requests.compat
? dummy_thread                        imported from requests.packages.urllib3.packages.ordered_dict
? ndg                                 imported from requests.packages.urllib3.contrib.pyopenssl
? netbios                             imported from uuid
? pyasn1                              imported from requests.packages.urllib3.contrib.pyopenssl
? readline                            imported from cmd, code, pdb
? simplejson                          imported from requests.compat
? thread                              imported from requests.packages.urllib3.packages.ordered_dict
? urllib.getproxies                   imported from requests.compat
? urllib.proxy_bypass                 imported from requests.compat
? urllib.quote                        imported from requests.compat
? urllib.quote_plus                   imported from requests.compat
? urllib.unquote                      imported from requests.compat
? urllib.unquote_plus                 imported from requests.compat
? urllib.urlencode                    imported from requests.compat, requests.packages.urllib3.request
? win32api                            imported from platform
? win32con                            imported from platform
? win32wnet                           imported from uuid
Building 'dist\script.exe'.

【问题讨论】:

  • 你确定你使用python-request 用于python 3,因为它对我来说不是:Queuethread 仅在 Python 2 中
  • 正如前面的评论所暗示的,py2exe 可能会因为您同时安装了 Python 2.x 和 3.x 而感到困惑。当您的系统有多个版本的 Python 时,您必须将您想要的任何扩展模块的适当版本正确安装到适当的版本中。
  • Python-request 支持同一个包中的两个版本。我试图在只有 python 3 的电脑上使用 py2exe,但发生了同样的情况

标签: python python-3.x module python-requests py2exe


【解决方案1】:

如果您的程序崩溃 'FileNotFoundError: [Errno 2] 没有这样的文件或目录' 问题不在于缺少模块,而是缺少 SSL 验证所需的文件“cacert.pem”。

有人在这个帖子中解释了如何解决这个问题 - Requests library: missing file after cx_freeze

我从 py2exe 切换到 cx_freeze,因为我发现在 cx_freeze 中处理这个丢失文件问题更容易。

这是我完整的 cx_freeze 代码,展示了如何完全实现另一个 StackOverflow 线程中描述的解决方案,这将解决这个“cacert.pem”问题。我确定 py2exe 中的解决方案是相同的,您只需要找到 cx_freeze 'include_files' 的 py2exe 等效项。也许知道的人可以帮忙。

这里是 setup.py 文件 -

from cx_Freeze import setup, Executable
import sys
import requests.certs

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]}

setup(name='MyProgramName',
      version='1.0',
      description='ProgramDescription',
      options={"build_exe":build_exe_options},
      executables=[Executable('myScript.py',base=base)])

现在,在您向 SSL 服务器发出请求的脚本中,您必须添加一个“验证”参数,并将其定向到“cacert.pem”文件。

r = requests.post('https://wherever.com', verify='cacert.pem')

或者如果您不想要 SSL 验证

r = requests.post('https://wherever.com', verify=False)

问题是“验证”默认设置为“真”,因此它会发送它寻找不存在的 cacert.pem 文件。

我将 .pem 文件保存在与可执行文件相同的目录中,并且能够直接链接到它,verify='cacert.pem'。如果这对你不起作用,或者你想把它放在另一个目录中,有一些解决方案可以在另一个 StackOverflow 线程中获取你的 exe 文件的 cwd。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2012-06-01
    • 2014-03-03
    相关资源
    最近更新 更多