将.py编译为.exe

时间:2016-10-08 02:22:10

标签: python ssl ssl-certificate python-requests

我有一个读取URL的脚本。如果我使用python app.py将其运行到cmd,它可以正常工作。但是在使用py2exe编译它并运行.exe后我收到此错误

entering main now.....
Traceback (most recent call last):
  File "strtojson.py", line 257, in <module>
  File "strtojson.py", line 209, in main
  File "requests\api.pyc", line 70, in get
  File "requests\api.pyc", line 56, in request
  File "requests\sessions.pyc", line 475, in request
  File "requests\sessions.pyc", line 596, in send
  File "requests\adapters.pyc", line 497, in send
requests.exceptions.SSLError: [Errno 2] No such file or directory

以下是我访问该网站的方式。

url = 'https://www.sec.gov/cgi-bin/browse-edgar?company=&CIK=&type=8-k&owner=include&count=100&action=getcurrent'
response = requests.get(url)
html = response.content
soup = BeautifulSoup(html, "html.parser")

这是我的setup.py

from distutils.core import setup
import py2exe
setup(console=['strtojson.py'], options = {'py2exe' : {'packages': ['bs4', 'requests']}})

我在Win 7 64bit上使用Python 2.7.12

1 个答案:

答案 0 :(得分:0)

我的猜测是Python将不再找到可信CA(需要验证服务器证书),因为它们不包含在exe中。在这种情况下,requests.get使用verify=False应该有效。

但这应该只是为了验证这确实是导致问题的原因。然后,更好的解决方法是将必要的可信CA放入文件中,将此文件与exe一起发送,然后使用verify='trusted-ca.pem'。您可以在https://curl.haxx.se/docs/caextract.html获得广泛使用的受信任CA集合。

虽然让requests使用某些字符串作为可信CA会很好,但我不认为这是支持的。您当然可以将可信CA作为字符串包含在exe中,然后在调用requests.get(..., verify='temporary-ca-file.pem')之前从中创建一个临时文件。