2

背景
我正在使用 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 的导入混淆了,但我不确定。

解决方法
我可以通过编辑 col.py 以mxdatetime_available = False在使用 DateTime.DateTime() 失败之前进行设置,以便它永远不会尝试使用 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()
4

1 回答 1

1

解决方案
使用 setup.py 中的 excludes build_exe 选项显式删除 DateTime 以防止 col.py 中的导入错误地找到它们。

安装程序.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 模块,并且它与这些其他模块没有相同的接口,所以通过排除它可以避免无效检查。

于 2016-02-03T15:44:49.583 回答