Search code examples
pythonopensslgoogle-drive-apicx-freeze

Google API and cx_Freeze not working properly


I have made a Python program that is capable of uploading files into Google Drive. The .py file works perfectly and does not give any errors.

But as I'm going to distribute it for people who do not have Python installed, I must turn the program and the resources into a .exe. I have done this with cx_Freeze. I have used it before and it has always worked.

But now, the Google Drive API seems to be causing errors when the .exe is run. Here are the errors it gives:

Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
  "__main__", fname, loader, pkg_name)

File "C:\Python27\lib\runpy.py", line 72, in _run_code
  exec code in run_globals

File "Test.py", line 41, in <module>

File "C:\Python27\lib\oauth2client\util.py", line 128, in positional_wrapper
  return wrapped(*args, **kwargs)

File "C:\Python27\lib\oauth2client\client.py", line 1283, in step2_exchange
  headers=headers)

File "C:\Python27\lib\site-packages\httplib2-0.8-py2.7.egg\httplib2\__init__.p
y", line 1570, in request
  (response, content) = self._request(conn, authority, uri, request_uri, metho
d, body, headers, redirections, cachekey)

File "C:\Python27\lib\site-packages\httplib2-0.8-py2.7.egg\httplib2\__init__.p
y", line 1317, in _request
  (response, content) = self._conn_request(conn, request_uri, method, body, he
aders)

File "C:\Python27\lib\site-packages\httplib2-0.8-py2.7.egg\httplib2\__init__.p
y", line 1252, in _conn_request
  conn.connect()

File "C:\Python27\lib\site-packages\httplib2-0.8-py2.7.egg\httplib2\__init__.p
y", line 1021, in connect
  self.disable_ssl_certificate_validation, self.ca_certs)

File "C:\Python27\lib\site-packages\httplib2-0.8-py2.7.egg\httplib2\__init__.p
y", line 80, in _ssl_wrap_socket
  cert_reqs=cert_reqs, ca_certs=ca_certs)

File "C:\Python27\lib\ssl.py", line 383, in wrap_socket
  ciphers=ciphers)

File "C:\Python27\lib\ssl.py", line 141, in __init__
  ciphers)

ssl.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate rout
ines:X509_load_cert_crl_file:system lib

It gives this error after the user has typed in the authorization code.

After some debugging, I found out that the line causing this problem was

credentials = flow.step2_exchange(code)

Here is a snippet of the code:

flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()
webbrowser.open(authorize_url)
code = raw_input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)
http = httplib2.Http()
http = credentials.authorize(http)
drive_service = build('drive', 'v2', http=http)

The CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE and REDIRECT_URI are all configured correctly.

So, what could be the problem here?

If you need to see more code, ask and I will update this question.


Solution

  • Looks like it can't find your SSL certificates. This is kind of understandable because httplib2 loads them from the file system, and nothing tells cx_Freeze to put them in the bundled package.

    Read this, it will help: https://github.com/kennethreitz/requests/issues/557#issuecomment-6420819