Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html等文件問(wèn)題
1 調(diào)試過(guò)程
用Python3.6+Sciter+PyCharm寫(xiě)了一個(gè)py測(cè)試腳本helloworld.py,該腳本中只含有一條語(yǔ)句“import sciter”。在PyCharm中運(yùn)行之,未報(bào)錯(cuò)。
#helloworld.py import sciter
然后將該腳本用PyInstaller打包成exe文件,打包程序pack.py如下:
#pack.py from PyInstaller.__main__ import run if __name__ == '__main__': opts = [ # 字符串前加“r”,防止字符轉(zhuǎn)義 # r'--hidden-import=py4j.java_collections',\ # 要打包的Python文件 r'D:\work\python\my_editor\helloworld\helloworld.py',\ # -F, –onefile 打包一個(gè)單個(gè)文件,如果你的代碼都寫(xiě)在一個(gè).py文件的話(huà),可以用這個(gè),如果是多個(gè).py文件就別用 # '-F',\ # -w:制作窗口程序,與之相對(duì)的-c意味制作命令行程序(默認(rèn))。--distpath指定打包的目的地路徑 r'-w','--distpath=D:\work\python\my_editor\helloworld\dist',\ # --workpath 指定工作路徑 r'--workpath=D:\work\python\my_editor\helloworld\out',\ # --specpath指定.spec文件保存路徑 r'--specpath=D:\work\python\my_editor\helloworld\out',\ # --icon 指定exe文件的圖標(biāo) r'--icon=D:\work\python\my_editor\ico\text.ico',\ # --upx-dir 使用upx壓縮 r'--upx-dir','upx393w',\ # --add-data 指定要包含的資源文件。 # “C:\\Windows\\System32\\sciter.dll”為資源文件原本所在路徑(source)。 # “.”為相對(duì)于exe文件的路徑(destination),在這里“.”為同一目錄的意思。 # source路徑與destination路徑以英文狀態(tài)下分號(hào)“;”隔開(kāi)。 # r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \ # r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages' ] run(opts)
打包過(guò)程未報(bào)錯(cuò),但打包后執(zhí)行exe文件就出現(xiàn)問(wèn)題了,如下圖,報(bào)錯(cuò)“Failed to execute script helloworld”。
就這么一句話(huà),沒(méi)有其他任何的報(bào)錯(cuò)信息,很令人惱火。后來(lái)查了資料,發(fā)現(xiàn)在打包時(shí),可以指定exe以命令行模式執(zhí)行,就能看到報(bào)錯(cuò)信息,而非以當(dāng)前的窗口模式執(zhí)行。即將上述pack.py腳本中的opts選項(xiàng)列表里的“-w”改為“-c”。
再次打包執(zhí)行exe文件,發(fā)現(xiàn)了彈出了一個(gè)含有報(bào)錯(cuò)信息的窗口。但是窗口一閃即逝,根本看不清里面的報(bào)錯(cuò)信息。這是因?yàn)槌绦驋伋霎惓M顺隽?;即使不拋出異常,窗口也?huì)因程序執(zhí)行完成而消失。于是將主程序helloworld.py的代碼改為如下:
#helloworld.py import traceback
#加上try-except語(yǔ)句,是為了防止程序在出現(xiàn)異常時(shí)奔潰退出。 try: import sciter except Exception as e: #打印異常棧軌跡。 traceback.print_exc() #使程序阻塞,防止程序執(zhí)行完畢退出。 a = input()
再次打包執(zhí)行exe文件,能看到報(bào)錯(cuò)信息了,如下圖。其中的核心信息是“ImportError: C:\Windows\System32\sciter.dll was not found in PATH”,即缺少sciter.dll文件。
這就很奇怪了,在PyCharm中運(yùn)行時(shí)沒(méi)報(bào)這個(gè)錯(cuò)??!查看PyInstaller官網(wǎng),得知PyInstaller打包后的exe程序不能自動(dòng)識(shí)別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項(xiàng)。比如下面的helloworld.spec片段,添加了sciter.dll文件到與exe文件同級(jí)的目錄(.)中;添加了word.html到比exe文件所在目錄更深一層的目錄(pages)中(若是只報(bào)錯(cuò)缺少dll文件,可不指定html文件)。
#helloworld.spec片段
a = Analysis(['D:\\work\\python\\my_editor\\helloworld\\helloworld.py'], pathex=['D:\\work\\python\\my_editor\\helloworld\\out'], binaries=[], datas=[('C:\\Windows\\System32\\sciter.dll', '.'), ('D:\\work\\python\\my_editor\\helloworld\\pages\\word.html', 'pages')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)
但每次執(zhí)行完打包程序后,還要手動(dòng)修改spec文件,很是麻煩。通過(guò)調(diào)試PyInstaller源代碼,找到了另一種方法,即在pack.py打包程序中的opts選項(xiàng)列表里加上兩個(gè)“--add-data選項(xiàng)”,如下:
#helloworld.py片段
opts = [ """ 其他選項(xiàng)與上面的helloworld.py同,此處省略。 """ # --add-data 指定要包含的資源文件。 # “C:\\Windows\\System32\\sciter.dll”為資源文件原本所在路徑(source)。 # “.”為相對(duì)于exe文件的路徑(destination),在這里“.”為同一目錄的意思。 # source路徑與destination路徑以英文狀態(tài)下分號(hào)“;”隔開(kāi)。 r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \ r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages' ]
再次打包運(yùn)行exe文件,執(zhí)行成功!
2 要點(diǎn)總結(jié)
(1)調(diào)試打包時(shí),指定PyInstaller打包程序參數(shù)為“-c”(命令行模式),方便閱讀報(bào)錯(cuò)信息。等到調(diào)試完成正式上線后再改為“-w”。
(2)通過(guò)捕捉異常和使程序阻塞,防止程序過(guò)早退出,以便于看清楚報(bào)錯(cuò)信息。
(3)PyInstaller打包后的exe程序不能自動(dòng)識(shí)別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項(xiàng),或者在PyInstaller打包程序參數(shù)中指定一個(gè)或多個(gè)“--add-data”選項(xiàng)。
總結(jié)
以上所述是小編給大家介紹的Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html等文件問(wèn)題 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- Python大數(shù)據(jù)之使用lxml庫(kù)解析html網(wǎng)頁(yè)文件示例
- python 利用jinja2模板生成html代碼實(shí)例
- 詳解python3中用HTMLTestRunner.py報(bào)ImportError: No module named ''StringIO''如何解決
- Python使用get_text()方法從大段html中提取文本的實(shí)例
- 使用Python自動(dòng)生成HTML的方法示例
- Python使用正則表達(dá)式去除(過(guò)濾)HTML標(biāo)簽提取文字功能
- Python獲取基金網(wǎng)站網(wǎng)頁(yè)內(nèi)容、使用BeautifulSoup庫(kù)分析html操作示例
- Python識(shí)別html主要文本框過(guò)程解析
相關(guān)文章
python如何通過(guò)pyqt5實(shí)現(xiàn)進(jìn)度條
這篇文章主要介紹了python如何通過(guò)pyqt5實(shí)現(xiàn)進(jìn)度條,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Window10上Tensorflow的安裝(CPU和GPU版本)
這篇文章主要介紹了Window10上Tensorflow的安裝(CPU和GPU版本),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python?教程實(shí)現(xiàn)?turtle海龜繪圖
這篇文章主要介紹了python?教程實(shí)現(xiàn)?turtle繪制海龜繪圖,文章基于python的相關(guān)資料展開(kāi)turtle繪制海龜繪圖的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05python中分組函數(shù)groupby和分組運(yùn)算函數(shù)agg的使用
本文主要介紹了python中分組函數(shù)groupby和分組運(yùn)算函數(shù)agg的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10pandas時(shí)間序列之pd.to_datetime()的實(shí)現(xiàn)
本文主要介紹了pandas時(shí)間序列之pd.to_datetime()的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06Python3.5基礎(chǔ)之變量、數(shù)據(jù)結(jié)構(gòu)、條件和循環(huán)語(yǔ)句、break與continue語(yǔ)句實(shí)例詳解
這篇文章主要介紹了Python3.5基礎(chǔ)之變量、數(shù)據(jù)結(jié)構(gòu)、條件和循環(huán)語(yǔ)句、break與continue語(yǔ)句,結(jié)合實(shí)例形式詳細(xì)分析Python3.5編程入門(mén)相關(guān)的變量、數(shù)據(jù)結(jié)構(gòu)、常用條件與循環(huán)語(yǔ)句操作技巧及注意事項(xiàng),需要的朋友可以參考下2019-04-04ITK 實(shí)現(xiàn)多張圖像轉(zhuǎn)成單個(gè)nii.gz或mha文件案例
這篇文章主要介紹了ITK 實(shí)現(xiàn)多張圖像轉(zhuǎn)成單個(gè)nii.gz或mha文件案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了
這篇文章主要介紹了分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了一勞永逸,需要的朋友可以參考下2020-12-12