我不知道为什么我无法导入包requests
。
如果我执行需要requests
库的脚本,它显然会崩溃。
请求库Web:
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'.
答案 0 :(得分:0)
如果您的程序崩溃了 ' 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相同的py2exe' include_files'。也许知道的人可以帮忙。
这是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)
问题是'验证'设为' True'默认情况下,这样就可以发送它寻找一个不存在的cacert.pem文件。
我将.pem文件保存在与可执行文件相同的目录中,并且能够直接链接到它,验证=' cacert.pem'。如果这对您不起作用,或者您想将它放在另一个目录中,则可以使用解决方案在另一个StackOverflow线程中获取您的exe文件的cwd。