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

标签 python datetime cx-freeze sqlobject

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

相关文章:

java - 使用 Java 将纪元时间和当前时刻之间的耗时转换为 ISO 8601 持续时间

python - 将 cx_freeze 与 mysql-connector 结合使用

python - 从数据框中的文本列中选择唯一的组合

javascript - AngularJS 中的时区在 ie9 文档模式下不正确

java - 在java 7中将2个日期之间的差异转换为天数

python - 使用 cx_freeze 4.3.1 卡住 pandas 0.15.1 时出错

python - 带有 tkinter xgboost 的 cxfreeze 小部件未显示但没有错误

python - 如果 BaseModel 获得意外参数,如何使 pydantic 引发 ValidationError

python selenium TimeUnit - 从哪里导入

javascript - FastApi 422 无法处理实体,关于身份验证,如何修复?