gpt4 book ai didi

python - 如何使用 cx_Freeze bundle 含 SQLObject 的应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 16:59:01 28 4
gpt4 key购买 nike

背景
我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com