上次用python的adodb模塊寫了個(gè)訪問access數(shù)據(jù)庫(kù)的程序,發(fā)布時(shí)想打包成單獨(dú)的一個(gè)exe文件,完成這個(gè)任務(wù)的工具是PyInstaller,我試過用它打包一些小python程序,一次就成功了,但adodb就不行了,似乎沒辦法將adodb模塊打包進(jìn)去.通過查看手冊(cè),總算明白是怎么回事了,PyInstaller無(wú)法獲知通過非常手段導(dǎo)入的模塊,
如調(diào)用__import__,exec,eval函數(shù).PyInstaller對(duì)于這種情況會(huì)在warn*.txt日志中留下一句警告:W: delayed __import__ hack detected at line 0 - adodb (D:\Program Files\Python25\Lib\site-packages\adodb\adodb.pyc)
這句警告說明了adodb.py中通過非常手段導(dǎo)入了一個(gè)未知模塊.通過查看adodb.py發(fā)現(xiàn)它確實(shí)是通過__import__導(dǎo)入了一個(gè)模塊:adodb_odbc.
解決該問題的步驟如下,在PyInstaller根目錄的hooks寫一個(gè)名為hook-adodb.py的文件內(nèi)容為:
hiddenimports = ['adodb_odbc']
在這個(gè)目錄上可以發(fā)現(xiàn)PyInstaller對(duì)于諸多已知模塊已經(jīng)內(nèi)置提供了相應(yīng)的hook文件.
接下來(lái)刪除打包所生成的一些文件,再次執(zhí)行打包過程,OK.
一些感想:對(duì)于非python項(xiàng)目,可以嘗試用Python進(jìn)行快速原型開發(fā),如驗(yàn)證算法等,當(dāng)項(xiàng)目期限將至?xí)r,轉(zhuǎn)化為其它語(yǔ)言的時(shí)間不夠時(shí),可用PyInstaller將這個(gè)Python程序轉(zhuǎn)化為exe,然后將這個(gè)exe分發(fā)給最終用戶,這樣對(duì)已有的系統(tǒng)布署不會(huì)造成過大的沖擊.