[英]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.