ssl.SSLError:[Errno 185090050]仅在py2exe和pyinstaller包中?

时间:2014-06-04 04:03:29

标签: python python-2.7 py2exe pyinstaller google-api-python-client

我的环境

windows 7

python 2.7

PyScripter

google-api-python-client 1.2

我尝试使用来自youtube data api的“按关键字搜索”的示例

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser


# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
# tab of
#   https://cloud.google.com/console
# Please ensure that you have enabled the YouTube Data API for your project.
DEVELOPER_KEY = "REPLACE_ME"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def youtube_search(options):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey = DEVELOPER_KEY)

  # Call the search.list method to retrieve results matching the specified
  # query term.
  search_response = youtube.search().list(
    q=options.q,
    part="id,snippet",
    maxResults=options.max_results
  ).execute()

  videos = []
  channels = []
  playlists = []

  # Add each result to the appropriate list, and then display the lists of
  # matching videos, channels, and playlists.
  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
    elif search_result["id"]["kind"] == "youtube#channel":
      channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
    elif search_result["id"]["kind"] == "youtube#playlist":
      playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

  print "Videos:\n", "\n".join(videos), "\n"
  print "Channels:\n", "\n".join(channels), "\n"
  print "Playlists:\n", "\n".join(playlists), "\n"


if __name__ == "__main__":
  argparser.add_argument("--q", help="Search term", default="Google")
  argparser.add_argument("--max-results", help="Max results", default=25)
  args = argparser.parse_args()

  try:
    youtube_search(args)
  except HttpError, e:
    print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)

正常情况下,运行源代码一切正常

但是当我使用py2exe和pyinstall包.py然后运行EXE总是这样的错误:

Traceback (most recent call last):
  File "searchvideo.py", line 133, in <module>
    youtube_search(SEARCH_STRING[keylist])
  File "searchvideo.py", line 41, in youtube_search
    developerKey=DEVELOPER_KEY)
  File "oauth2client\util.pyc", line 132, in positional_wrapper
  File "apiclient\discovery.pyc", line 192, in build
  File "httplib2\__init__.pyc", line 1570, in request
  File "httplib2\__init__.pyc", line 1317, in _request
  File "httplib2\__init__.pyc", line 1252, in _conn_request
  File "httplib2\__init__.pyc", line 1021, in connect
  File "httplib2\__init__.pyc", line 80, in _ssl_wrap_socket
  File "ssl.pyc", line 387, in wrap_socket
  File "ssl.pyc", line 141, in __init__
ssl.SSLError: [Errno 185090050] _ssl.c:343: error:0B084002:x509 certificate rout
ines:X509_load_cert_crl_file:system lib

py2exe setup.py

from distutils.core import setup
import py2exe

setup(
    console=['searchvideo.py'],
    data_files=['cacert.pem', 'cacerts.txt']
)

1 个答案:

答案 0 :(得分:1)

如果您尝试生成使用httplib2等软件包的可执行文件,您可能希望将ca_certs包含在您的可执行文件中。

因此,在build_exe选项中包括:

    {"include_files": ['path_to_your_ca_certs_file'],}

请记住修改代码中的ca_certs路径,例如:

    httplib2.Http(ca_certs='path_to_your_ca_certs_file_in_the_executable_package')