pyinstaller作爲一個python打包利器,雖然很方便,但坑實在是多。這不,好久沒打過包了,今天一打包,又來了新錯:
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Program Files\Python36\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "D:\work\python\whiteWalker2\venv\Scripts\pyinstaller.exe\__main__.py", line 9, in <module>
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\__main__.py", line 114, in run
run_build(pyi_config, spec_file, **vars(args))
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\__main__.py", line 65, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\build_main.py", line 734, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\build_main.py", line 681, in build
exec(code, spec_namespace)
File "D:\work\python\whiteWalker2\endpoint.spec", line 33, in <module>
console=False , icon='app.ico')
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\api.py", line 436, in __init__
upx_exclude=self.upx_exclude
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\api.py", line 199, in __init__
self.__postinit__()
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\datastruct.py", line 160, in __postinit__
self.assemble()
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\api.py", line 262, in assemble
dist_nm=inm)
File "d:\work\python\whitewalker2\venv\lib\site-packages\PyInstaller\building\utils.py", line 225, in checkCache
os.remove(cachedfile)
FileNotFoundError: [WinError 2] 系統找不到指定的文件。: 'C:\\Users\\Administrator\\AppData\\Roaming\\pyinstaller\\bincache00_py36_64bit\\api-ms-win-core-handle-l1-1-0.dll'
這不同於以前的第三方庫文件找不到,這次就是pyinstaller自身無法找到文件。
於是,填坑開始:
首先,按照國際慣例,刪除build和dist目錄,重新打包 =》失敗。
只好去system32找api-ms-win-core-handle-l1-1-0.dll,發現它好好的躺在那,並沒有缺少。但是看報錯的查找路徑
C:\\Users\\Administrator\\AppData\\Roaming\\pyinstaller\\bincache00_py36_64bit\\api-ms-win-core-handle-l1-1-0.dll
似乎pyinstaller沒有全局尋找該dll,而是從一個它指定的目錄(很有可能是緩存)中查找,查找失敗後,也沒有返回系統環境中找,故而報錯.
當然,無腦修復方法就是把dll拷過去,但按照拷dll的尿性,拷完一個,必然缺下一個,這可太蛋疼了。
既然是緩存,那如果幹脆把這個文件夾刪除,重新打包是否可行呢?
於是立馬進入
C:\Users\Administrator\AppData\Roaming\pyinstaller
將pyinstaller目錄下的所有東西全刪了
重新打包=》成功。
後記:類似緩存中少了dll,pyinstaller又不去全局中補足,導致無法打包的情況,都可以清空其緩存,讓pyinstaller重建緩存解決。如果報錯的路徑與文中不同,可參考這個解決思路進行修復。而至於爲什麼好端端的dll會少掉,大概就是電腦的忠實衛士360乾的好事了。