背景
我正在使用 cx_Freeze 构建我的应用程序的 Windows 和 Mac 包;构建在两个平台上都成功执行,在 Windows 上生成 msi,在 Mac 上生成 dmg/app,我可以安装它。
问题
当我在任一平台上运行应用程序时都会出现问题。我收到错误:
AttributeError:“模块”对象没有属性“DateTime”
这是由 site-packages/sqlobject/col.py 第 66 行触发的:
DateTimeType = type(DateTime.DateTime())
我从未安装过 mx DateTime,也从未在通过 IDE 或脚本运行应用程序时遇到任何问题,但以某种方式与 cx_Freeze 捆绑正在改变某些内容。我假设 DateTime 的导入 (col.py) 与 datetime 的导入混淆了,但我不确定。
解决方法:
在使用 DateTime.DateTime() 失败之前,我可以通过编辑 col.py 设置 mxdatetime_available = False
来使一切正常工作,这样它就不会尝试使用 mxDateTime。然而,在本地修改底层库源显然不是我想要做和维护的事情。
有谁知道我在这里可能会缺少什么以避免错误导入第三方库?我的 hack 不是一个有效的修复程序,我可以提交给 SQLObject 项目,因为它删除了每个人的功能,但它不应该进入该代码路径,而且我只是没有看到根本原因。
我的 setup.py(为简洁起见,删除了一些位)
import sys
from cx_Freeze import Executable, setup
cx_freeze_target = [Executable(script="main.py")]
setup_dict = dict(
name="myapp",
version="0.0.3",
author="me",
description="An app",
license="Undecided",
packages=['myapp'],
executables=cx_freeze_target
)
def main():
setup(**setup_dict)
if __name__ == '__main__':
main()
最佳答案
解决方案
使用 setup.py 中的 excepts build_exe 选项显式删除 DateTime,从而防止 col.py 中的导入错误地找到它们。
setup.py
import sys
from cx_Freeze import Executable, setup
cx_freeze_target = [Executable(script="main.py")]
build_options = dict(
build_exe=dict(
excludes=['DateTime']
)
)
setup_dict = dict(
name="myapp",
version="0.0.3",
author="me",
description="An app",
license="Undecided",
packages=['myapp'],
executables=cx_freeze_target,
options=build_options
)
def main():
setup(**setup_dict)
if __name__ == '__main__':
main()
根本原因
从 SQLObject 源来看,它似乎尝试导入 DateTime,如果有效,则假定它是 Zope DateTime 模块;因为我没有部署 MX 或 Zope,所以它一定是正在找到的另一个 DateTime 模块,并且它与这些其他模块没有相同的接口(interface),因此通过排除它,我可以避免无效检查。
关于python - 如何使用 cx_Freeze bundle 含 SQLObject 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163849/