0

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

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

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

PS我现在跟踪错误,如下所示:

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中的方法,但它不起作用。有谁知道如何修理它?

4

2 回答 2

0

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

但您可以将其缩小为:

  1. 从 STDIN/STDOUT 读/写
  2. 启动本地 Web 服务器
  3. 启动浏览器

因为所有这些都需要在本地运行流程时执行,其中一个对您来说是错误的。

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

于 2012-08-04T20:37:45.757 回答
0

经过一番挖掘,我找到了基于 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似乎没有找到数据文件

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

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

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

于 2012-08-16T06:16:34.987 回答