cx_freeze 一个包含 Dropbox 的 Python 脚本
Posted
技术标签:
【中文标题】cx_freeze 一个包含 Dropbox 的 Python 脚本【英文标题】:cx_freeze a python script including dropbox 【发布时间】:2014-12-08 00:09:21 【问题描述】:我想冻结一个使用 dropbox 上传文件的 python 脚本。我正在使用 python 2.7 和 windows 7。如果我只尝试这个示例代码:
import dropbox
client = dropbox.client.DropboxClient(<authtoken>)
client.put_file('FileName',"", overwrite=True)
我使用 Dropbox 创建了一个应用程序并生成了一个令牌,该令牌在 Dropbox 主页上进行了说明。如果我只使用 python 脚本,则该示例有效。对于未来的应用程序,我想冻结脚本以在没有 python 的计算机上使用它。 如果我执行 .exe 文件,我会收到以下错误消息,我将 python 脚本命名为 dropbox.py:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
exec(code, m.__dict__)
File "dropbox.py", line 2, in <module>
File "H:\dropbox.py", line 3, in <module>
client = dropbox.client.DropboxClient("authToken")
AttributeError: 'module' object has no attribute 'client'
已解决:请勿将 dropbox.py 用于示例脚本 该错误表明它找不到客户端模块,但是如何解决此错误? 我的 setup.py 文件是:
import cx_Freeze
import sys
base = None
executables = [
cx_Freeze.Executable("dropbox.py", base = base),
]
build_exe_options = "includes":[],
"include_files":[],
"excludes":[],
"packages":[]
cx_Freeze.setup(
name = "script",
options = "build_exe": build_exe_options,
version = "0.0",
description = "A basic example",
executables = executables)
我也尝试添加包“dropbox”,但它不起作用。
我希望有人可以帮助我。也许还有另一种方法可以将文件上传到 Dropbox?
欢呼麦克斯
编辑1: 事实上,我的示例脚本的名称有问题。虽然还是不行。新的错误是:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
exec(code, m.__dict__)
File "mydropbox.py", line 2, in <module>
File "C:\Python27\lib\site-packages\dropbox\__init__.py", line 3, in <module>
from . import client, rest, session
File "C:\Python27\lib\site-packages\dropbox\client.py", line 22, in <module>
from .rest import ErrorResponse, RESTClient, params_to_urlencoded
File "C:\Python27\lib\site-packages\dropbox\rest.py", line 26, in <module>
TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
File "build\bdist.win32\egg\pkg_resources.py", line 950, in resource_filename
File "build\bdist.win32\egg\pkg_resources.py", line 1638, in get_resource_filename
NotImplementedError: resource_filename() only supported for .egg, not .zip
我试图解决这个网站的错误:
enter link description here
但不起作用。有人对我的新错误有解决方案吗?
【问题讨论】:
您是否已将您的脚本称为dropbox.py
?如果是这样,请尝试将其称为其他名称,例如 dropbox-upload.py
- 它可能会找到您的脚本而不是 Dropbox 包。
感谢帮助,它将错误更改为: NotImplementedError: resource_filename() only supported for .egg, not .zip
我也找到了一个帖子,你解决了同样的问题,但我解决不了? bitbucket.org/anthony_tuininga/cx_freeze/issue/19/…
@ThomasK:我认为这是有关trusted-certs.crt 的问题,但我该如何解决呢?
@Max 深入 Dropbox 库,找出导致错误的行。你一定会自己解决的。
【参考方案1】:
我已经通过这种方式解决了这个问题:
1) 在您的保管箱模块位置找到文件“rest.py”(C:\Python27\Lib\site-packages\dropbox-2.2.0-py2.7.egg\dropbox - 在我的情况下)
2) 注释字符串TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
3) 你可以写
TRUSTED_CERT_FILE = 'trusted-certs.crt'
(我用过这种方式)或者
if hasattr(sys, 'frozen'):
TRUSTED_CERT_FILE = 'trusted-certs.crt'
else:
TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
4) 从 dropbox 目录中删除所有 pyc 文件并使用您的程序运行 py 文件
5) 使用 cx_freeze 重建可执行文件
6) 将trusted-certs.crt 文件从dropbox 目录复制到library.zip/dropbox
7) 尽情享受吧!
【讨论】:
以上是关于cx_freeze 一个包含 Dropbox 的 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章