您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python3+PyInstall+Sciter中報錯缺少dll、html等文件怎么辦,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1 調試過程
用Python3.6+Sciter+PyCharm寫了一個py測試腳本helloworld.py,該腳本中只含有一條語句“import sciter”。在PyCharm中運行之,未報錯。
#helloworld.py import sciter
然后將該腳本用PyInstaller打包成exe文件,打包程序pack.py如下:
#pack.py from PyInstaller.__main__ import run if __name__ == '__main__': opts = [ # 字符串前加“r”,防止字符轉義 # r'--hidden-import=py4j.java_collections',\ # 要打包的Python文件 r'D:\work\python\my_editor\helloworld\helloworld.py',\ # -F, –onefile 打包一個單個文件,如果你的代碼都寫在一個.py文件的話,可以用這個,如果是多個.py文件就別用 # '-F',\ # -w:制作窗口程序,與之相對的-c意味制作命令行程序(默認)。--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文件的圖標 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)。 # “.”為相對于exe文件的路徑(destination),在這里“.”為同一目錄的意思。 # source路徑與destination路徑以英文狀態下分號“;”隔開。 # r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \ # r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages' ] run(opts)
打包過程未報錯,但打包后執行exe文件就出現問題了,如下圖,報錯“Failed to execute script helloworld”。
就這么一句話,沒有其他任何的報錯信息,很令人惱火。后來查了資料,發現在打包時,可以指定exe以命令行模式執行,就能看到報錯信息,而非以當前的窗口模式執行。即將上述pack.py腳本中的opts選項列表里的“-w”改為“-c”。
再次打包執行exe文件,發現了彈出了一個含有報錯信息的窗口。但是窗口一閃即逝,根本看不清里面的報錯信息。這是因為程序拋出異常退出了;即使不拋出異常,窗口也會因程序執行完成而消失。于是將主程序helloworld.py的代碼改為如下:
#helloworld.py import traceback
#加上try-except語句,是為了防止程序在出現異常時奔潰退出。 try: import sciter except Exception as e: #打印異常棧軌跡。 traceback.print_exc() #使程序阻塞,防止程序執行完畢退出。 a = input()
再次打包執行exe文件,能看到報錯信息了,如下圖。其中的核心信息是“ImportError: C:\Windows\System32\sciter.dll was not found in PATH”,即缺少sciter.dll文件。
這就很奇怪了,在PyCharm中運行時沒報這個錯啊!查看PyInstaller官網,得知PyInstaller打包后的exe程序不能自動識別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項。比如下面的helloworld.spec片段,添加了sciter.dll文件到與exe文件同級的目錄(.)中;添加了word.html到比exe文件所在目錄更深一層的目錄(pages)中(若是只報錯缺少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)
但每次執行完打包程序后,還要手動修改spec文件,很是麻煩。通過調試PyInstaller源代碼,找到了另一種方法,即在pack.py打包程序中的opts選項列表里加上兩個“--add-data選項”,如下:
#helloworld.py片段
opts = [ """ 其他選項與上面的helloworld.py同,此處省略。 """ # --add-data 指定要包含的資源文件。 # “C:\\Windows\\System32\\sciter.dll”為資源文件原本所在路徑(source)。 # “.”為相對于exe文件的路徑(destination),在這里“.”為同一目錄的意思。 # source路徑與destination路徑以英文狀態下分號“;”隔開。 r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \ r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages' ]
再次打包運行exe文件,執行成功!
2 要點總結
(1)調試打包時,指定PyInstaller打包程序參數為“-c”(命令行模式),方便閱讀報錯信息。等到調試完成正式上線后再改為“-w”。
(2)通過捕捉異常和使程序阻塞,防止程序過早退出,以便于看清楚報錯信息。
(3)PyInstaller打包后的exe程序不能自動識別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項,或者在PyInstaller打包程序參數中指定一個或多個“--add-data”選項。
關于“Python3+PyInstall+Sciter中報錯缺少dll、html等文件怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。