使用PyInstaller打包含torchaudio(CPU版)的Python脚本为exe时遇属性错误
PyInstaller打包torchaudio脚本报错解决方案
问题概述
在Windows系统中,使用无GPU支持的torchaudio编写的Python脚本直接运行正常,但通过PyInstaller打包为.exe文件后运行,出现AttributeError: '_OpNamespace' 'torchaudio' object has no attribute 'cuda_version'错误。尝试安装带CUDA的torch后问题依旧,且包体积大幅增加。
复现代码
import torchaudio import time if __name__ == '__main__': t = torchaudio.transforms time.sleep(3) print("Success")
错误信息
Traceback (most recent call last): File "torch\_ops.py", line 501, in __getattr__ op, overload_names = torch._C._jit_get_operation(qualified_op_name) RuntimeError: No such operator torchaudio::cuda_version The above exception was the direct cause of the following exception: Traceback (most recent call last): File "test.py", line 1, in <module> File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module File "torchaudio\__init__.py", line 1, in <module> File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module File "torchaudio\_extension.py", line 136, in <module> File "torchaudio\_extension.py", line 121, in _check_cuda_version File "torch\_ops.py", line 505, in __getattr__ raise AttributeError( AttributeError: '_OpNamespace' 'torchaudio' object has no attribute 'cuda_version' [11648] Failed to execute script 'test' due to unhandled exception!
环境版本
- python==3.9.15
- torch==1.13.0(无GPU支持)
- torchaudio==0.13.0
- pyinstaller==5.6.2
- six==1.15.0
- numpy==1.22.4
- scipy==1.6.0
- sounddevice==0.4.5
解决方法
方法1:强制收集torchaudio所有文件
使用PyInstaller的--collect-all参数,确保打包时收集torchaudio的所有依赖文件,避免遗漏必要的扩展组件:
pyinstaller --collect-all torchaudio test.py
方法2:禁用CUDA检查(无GPU场景适用)
在脚本开头添加环境变量,强制torchaudio跳过CUDA版本检查,避免触发不存在的cuda_version操作符:
import os # 禁用CUDA检查 os.environ['TORCH_AUDIO_NO_CUDA'] = '1' import torchaudio import time if __name__ == '__main__': t = torchaudio.transforms time.sleep(3) print("Success")
修改后再用PyInstaller打包即可。
方法3:修改.spec文件(进阶)
如果上述方法无效,可手动编辑生成的test.spec文件,添加torchaudio的隐藏导入和二进制文件收集:
- 生成.spec文件:
pyinstaller --specpath . test.py - 打开
test.spec,修改Analysis部分:
a = Analysis( ['test.py'], pathex=[], binaries=[], datas=[], hiddenimports=['torchaudio._extension', 'torchaudio._torchaudio'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
- 重新打包:
pyinstaller test.spec
内容的提问来源于stack exchange,提问作者ronkov
相关产品推荐
相关产品推荐

