【问题标题】:google drive api crash with desktop application谷歌驱动器 api 与桌面应用程序崩溃
【发布时间】:2012-08-01 08:03:28
【问题描述】:

我使用 google drive 应用程序使用 python 编写了一个桌面应用程序,一切正常。但是当我使用 pyinstaller 输出一个 .exe 文件并运行该应用程序时。这些行出现问题:

if credentials is None or credentials.invalid:
  credentials = run(FLOW, storage)

身份验证页面显示,我允许其访问。与往常不同的是,在那之后没有任何反应,我发现.exe程序无故退出。 以前有人遇到过这个问题吗?如果有,如何解决?

附:我现在追踪错误,如下:

Traceback (most recent call last):
  File "<string>", line 697, in <module>
  File "<string>", line 562, in __init__
  File "build\bdist.win32\egg\oauth2client\tools.py", line 166, in run
  File "build\bdist.win32\egg\oauth2client\client.py", line 1069, in step2_exchange
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/httplib2", line 1544, in request
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/httplib2", line 1294, in _request
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/httplib2", line 1230, in _conn_request
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/httplib2", line 984, in connect
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/httplib2", line 80, in _ssl_wrap_socket
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/ssl", line 381, in wrap_socket
  File "USB\build\pyi.win32\USB\outPYZ1.pyz/ssl", line 141, in __init__
       ssl.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate rout
       ines:X509_load_cert_crl_file:system lib

我看到有人遇到了类似的错误http://code.google.com/p/google-api-python-client/issues/detail?id=58,但是回复说已经修复了。 我也尝试了https://github.com/kennethreitz/requests/issues/557 中的方法,但它不起作用。 有人知道怎么解决吗?

【问题讨论】:

    标签: python google-drive-api pyinstaller google-api-python-client


    【解决方案1】:

    我猜,但这可能与 pyinstaller 在 Windows exe 上的 STDIN 处理有关 - 通常这对您不可用,因此您可能必须运行自己的自定义流程。

    但您可以将其缩小为:

    1. 从 STDIN/STDOUT 读取/写入
    2. 启动本地网络服务器
    3. 启动浏览器

    因为在本地运行流程时需要执行所有这些操作,而其中一个对您来说会出错。

    如果您将 STDERR 记录到文本文件中,您将能够看到哪个部分崩溃了。

    【讨论】:

    • 实际上程序可以启动带有身份验证页面的网络浏览器,但单击允许后,它应该继续,但它只是退出而没有警告或错误消息。你介意告诉我如何记录 STDERR 吗?
    • 对不起,我不熟悉 pyinstaller。 pyinstaller.org/export/develop/project/doc/… 有一些信息。
    【解决方案2】:

    经过一番挖掘,我找到了基于 Dropbox api 开发者提供的解决方案的解决方案:https://forums.dropbox.com/topic.php?id=65523&replies=1#post-461457。这个问题基本上是由于:

     CA_CERTS = os.path.join(os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")
    
    __file__ is the key that causes this problem. It cannot work normally in the executable program to find the path.
    

    类似的问题可以在这里找到:pyinstaller seems not to find a data file

    为了解决这个问题,我把上面的代码改成这样:

     CA_CERTS = os.path.join(os.path.dirname(sys.executable), "cacerts.txt")
    

    通过这样做,.exe 程序将尝试在 .exe 文件所在的目录中查找 cacerts.txt。将其编译为 .pyc 后,我将 cacerts.txt 放入 .exe 目录。然后程序就可以正常运行了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多