環境
- anaconda : 24.1.2
- python : 3.7.13
- pyinstaller : 5.13.0
問題描述
之前使用pyintaller執行spec文件打包都是能成功,今天打包報了“文件所在的卷已被外部更改,因此打開的文件不再有效。”的錯誤
Traceback (most recent call last):File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\isolated\_child.py", line 63, in run_next_commandoutput = function(*args, **kwargs)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\building\build_main.py", line 187, in find_binary_dependenciesreturn bindepend.Dependencies(binaries, redirects=binding_redirects, xtrapath=extra_libdirs)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\depend\bindepend.py", line 275, in Dependenciesfor ftocnm, fn in getAssemblyFiles(pth, manifest, redirects):File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\depend\bindepend.py", line 449, in getAssemblyFilesfor assembly in getAssemblies(pth):File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\depend\bindepend.py", line 403, in getAssembliesres = winmanifest.GetManifestResources(pth)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\utils\win32\winmanifest.py", line 979, in GetManifestResourcesreturn winresource.GetResources(filename, [RT_MANIFEST], names, languages)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\PyInstaller\utils\win32\winresource.py", line 155, in GetResourceshsrc = win32api.LoadLibraryEx(filename, 0, LOAD_LIBRARY_AS_DATAFILE)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\win32ctypes\pywin32\win32api.py", line 40, in LoadLibraryExreturn _dll._LoadLibraryEx(fileName, 0, flags)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\contextlib.py", line 130, in __exit__self.gen.throw(type, value, traceback)File "C:\Users\Lenovo\.conda\envs\python37_32\lib\site-packages\win32ctypes\pywin32\pywintypes.py", line 37, in pywin32errorraise error(exception.winerror, exception.function, exception.strerror)
win32ctypes.pywin32.pywintypes.error: (1006, 'LoadLibraryEx', '文件所在的卷已被外部更改,因此打開的文件不再有效。')
排查思路
- 搜索網上說是殺毒軟件隔離問題,停用掉殺毒軟件,無效
- 繼續搜索說是pyinstaller版本多個的問題,由于我是有兩套pyisntaller,一套是本機環境,一套是anaconda的環境,為了避免這個問題,我把本機的pyinstaller uninstall掉,還是無法解決我的問題
- 還有說是緩存的問題,我嘗試著清除了pyinstaller的緩存還重裝了pyinstaller,還是無法解決!
- 最后只能去github的pyinstaller查找issue,發現了有一個和我一樣的報錯,詳見
github issue
看了一下文中的描述和我的沒有關系,但是文中提到了一種排查方法就是打開debug日志
嘗試著打開debug日志,發現了pyinstaller是在分析./logs/app.log文件的時候報錯了
pyinstaller ***.spec --log-level DEBUG
app.log是個日志文件,突然間想到當時為了減輕打包的文件大小,故意將他清空了內容,容量為0KB,難不成是0KB讀取不了!于是試著對app.log隨便編輯寫入一些內容,有了大小,結果重新打包真的成功了!
總結
綜上所述,由于app.log是作為二進制文件打包進入的(見下圖的spec文件),pyintaller估計在讀取該文件的時候字節數量為0報錯了,當重新給app.log寫入內容就可以讀取成功