【问题标题】:How to bundle an app including SQLObject using cx_Freeze如何使用 cx_Freeze 捆绑包含 SQLObject 的应用程序
【发布时间】:2016-05-11 20:53:58
【问题描述】:

背景
我正在使用 cx_Freeze 构建我的应用程序的 Windows 和 Mac 包;构建在两个平台上都成功执行,导致 Windows 上的 msi 和 Mac 上的 dmg/app 我可以安装。

问题
当我在任一平台上运行应用程序时都会出现问题。我收到错误:
AttributeError: 'module' object has no attribute '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()

【问题讨论】:

    标签: python datetime cx-freeze sqlobject


    【解决方案1】:

    解决方案
    使用 setup.py 中的 excludes 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 模块,并且它与这些其他模块没有相同的接口,因此通过排除它可以避免无效检查。

    【讨论】:

      猜你喜欢
      • 2010-09-11
      • 1970-01-01
      • 2019-09-15
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多