簡體   English   中英

如何使用cx_Freeze捆綁包括SQLObject的應用程序

[英]How to bundle an app including SQLObject using cx_Freeze

背景
我正在使用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。 但是,本地修改基礎庫源顯然不是我想要做和維護的事情。

有人知道我在這里可能會缺少什么,以避免錯誤導入第三方庫嗎? 我的破解不是我可以提交給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中的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模塊,並且該模塊與這些其他模塊沒有相同的接口,因此通過排除它可以避免無效檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM