关于PyInstaller打包遇到的一些问题及解决方法
在复现完nerfstudio之后,我基于gradio做了一个将nerfstudio的各种功能集成到一个web端的项目,并将其嵌入到pyqt中,打包为桌面应用。以下就是我使用PyInstaller打包项目时遇到的一些问题,并给出了对应的解决方法,希望能够为大家提供一点小小的帮助。
-
AttributeError: Failed to retrieve attribute compiled from module pydantic
原因:pyinstaller包和pydantic包不兼容,把pydantic的代码稍作修改就好
解决方案:点击跳转 -
打包过程中pyisntaller终止并给出以下提示
解决方法:把import sys ; sys. setrecursionLimit(sys . getrecursiontimit()★5)
添加到运行pyinstaller后生成的.spec
文件中,再次打包时运行pyinstaller myprog. spec
,myprog.spec就是所生成的.spec文件 -
pyinstaller打包FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\vip\\AppData\\Local\\Temp\\_MEI152562\\gradio_client\\types.json'
我的项目是一个基于gradio并使用pyqt开发的一个桌面应用
解决方法:点击跳转 -
OSError: Can't get source for <function fisheye624_project at 0x000002E2121FC310>. TorchScript requires source access in order to carry out compilation, make sure original .py files are available.
解决方法:点击这里跳转
把以下代码片加入到主文件的开头就行
def script_method(fn, _rcb=None):
return fn
def script(obj, optimize=True, _frames_up=0, _rcb=None):
return obj
import torch.jit
script_method1 = torch.jit.script_method
script1 = torch.jit.script
torch.jit.script_method = script_method
torch.jit.script = script
OSError: Could not find compatible tinycudann extension for compute capability 75.
tinycuda是我在复现nerfstudio时安装的一个库,也就是我之前的博客提到的。这里需要把tinecudann相关的库都给添加到打包文件中
解决方法:点击跳转
使用--add-data命令将tinycudann依赖文件都打包进去:pyinstaller -w -F -i Icon_of_exe.ico --splash splash_picture.png --collect-data=gradio_client --collect-data=gradio --add-data "E:\Anaconda\envs\ns\Lib\site-packages\tinycudann-1.7-py3.8-win-amd64.egg;." webui_Chinese2.py
ValueError: Cannot load imports from non-existent stub 'C:\\Users\\vip\\AppData\\Local\\Temp\\_MEI255762\\skimage\\__init__.pyi'
解决方案:增加hook-skimage.pyModuleNotFoundError: No module named 'skimage.data._fetchers'
解决方法:点击跳转
将pyInstaller-hooks-contrib更新到2023.10
error: unrecognized arguments: --multiprocessing-fork
解决方法:点击跳转PermissionError:[WinError 5]拒绝访问
这个报错表明没有权限,以管理员权限打开cmd然后打包就可以了。
解决方法:点击跳转OSError: [Errno 22] Invalid argument
Traceback (most recent call last):
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\isolated\_parent.py", line 372, in call
return isolated.call(function, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\isolated\_parent.py", line 293, in call
ok, output = loads(b64decode(self._read_handle.readline()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
EOFError: EOF read where object expected
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "c:\Entwicklung\FP-Creator\env311\Scripts\pyinstaller.exe\__main__.py", line 7, in <module>
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\__main__.py", line 194, in _console_script_run
run()
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\__main__.py", line 180, in run
run_build(pyi_config, spec_file, **vars(args))
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\__main__.py", line 61, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\building\build_main.py", line 981, in main
build(specfile, distpath, workpath, clean_build)
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\building\build_main.py", line 903, in build
exec(code, spec_namespace)
File "FloodPlainCreator.spec", line 23, in <module>
a = Analysis(
^^^^^^^^^
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\building\build_main.py", line 415, in __init__
self.__postinit__()
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\building\datastruct.py", line 173, in __postinit__
self.assemble()
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\building\build_main.py", line 699, in assemble
isolated.call(find_binary_dependencies, list(self.binaries), self.binding_redirects, collected_packages)
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\isolated\_parent.py", line 371, in call
with Python() as isolated:
File "c:\Entwicklung\FP-Creator\env311\Lib\site-packages\PyInstaller\isolated\_parent.py", line 247, in __exit__
self._write_handle.flush()
OSError: [Errno 22] Invalid argument
在网上找了很久没有找到解决方法,后来在GitHub上的一个issue中找到了解决方法。找到了自己的虚拟环境所在路径,然后找到pyinstaller包的安装路径,再找到一个名为build_main.py的文件。比如我的路径是E:\Anaconda\envs\ns\Lib\site-packages\PyInstaller\building\build_main.py
,以记事本方式打开该文件,找到如下代码:
for package in import_packages:
try:
__import__(package)
except Exception:
pass
在try前面增加print(packages):
for package in import_packages:
print(package)
try:
__import__(package)
except Exception:
pass
然后重新执行Pinstaller打包的命令行,看在出现报错的时候,是在哪个包那里停止的,然后把该包pip uninstall 包名
就可以了。