报错内容如下:
Building wheels for collected packages: pynini
Building wheel for pynini (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
│ exit code: 1
╰─> [49 lines of output]
running bdist_wheel
running build
running build_py
creating build\lib.win-amd64-cpython-310\pynini
copying pynini\__init__.py -> build\lib.win-amd64-cpython-310\pynini
creating build\lib.win-amd64-cpython-310\pywrapfst
copying pywrapfst\__init__.py -> build\lib.win-amd64-cpython-310\pywrapfst
creating build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\case.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\chatspeak.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\chatspeak_model.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\dates.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\g2p.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\numbers.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\plurals.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\t9.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\weather.py -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\examples\__init__.py -> build\lib.win-amd64-cpython-310\pynini\examples
creating build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\export.py -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\grm.py -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\grm_example.py -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\multi_grm.py -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\multi_grm_example.py -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\export\__init__.py -> build\lib.win-amd64-cpython-310\pynini\export
creating build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\byte.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\edit_transducer.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\features.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\paradigms.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\pynutil.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\rewrite.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\rule_cascade.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\tagger.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\utf8.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\lib\__init__.py -> build\lib.win-amd64-cpython-310\pynini\lib
copying pynini\__init__.pyi -> build\lib.win-amd64-cpython-310\pynini
copying pynini\py.typed -> build\lib.win-amd64-cpython-310\pynini
copying pywrapfst\__init__.pyi -> build\lib.win-amd64-cpython-310\pywrapfst
copying pywrapfst\py.typed -> build\lib.win-amd64-cpython-310\pywrapfst
copying pynini\examples\py.typed -> build\lib.win-amd64-cpython-310\pynini\examples
copying pynini\export\py.typed -> build\lib.win-amd64-cpython-310\pynini\export
copying pynini\lib\py.typed -> build\lib.win-amd64-cpython-310\pynini\lib
running build_ext
building '_pywrapfst' extension
creating build\temp.win-amd64-cpython-310\Release\extensions
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.43.34808\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -IC:\ProgramData\anaconda3\envs\metahuman\include -IC:\ProgramData\anaconda3\envs\metahuman\Include "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.43.34808\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.22621.0\\cppwinrt" /EHsc /Tpextensions/_pywrapfst.cpp /Fobuild\temp.win-amd64-cpython-310\Release\extensions\_pywrapfst.obj -std=c++17 -Wno-register -Wno-deprecated-declarations -Wno-unused-function -Wno-unused-local-typedefs -funsigned-char
cl: 命令行 error D8021 :无效的数值参数“/Wno-register”
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Tools\\MSVC\\14.43.34808\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pynini
Running setup.py clean for pynini
Failed to build pynini
ERROR: Failed to build installable wheels for some pyproject.toml based projects (pynini)
从错误日志看,pynini
在编译时传递了 MSVC 编译器不支持的参数 -Wno-register
。这是典型的 GCC 参数在 MSVC 环境不兼容导致的问题。以下是具体解决方案:
解决方案
1. 使用 Conda 安装预编译包(强烈推荐)
直接通过 Conda 安装 pynini
的预编译二进制包(无需本地编译):
conda install -c conda-forge pynini
2. 修改编译参数(手动修复)
如果必须从源码安装,需删除 -Wno-register
参数:
-
找到
setup.py
所在位置:- 如果已下载源码包,直接修改源码。
- 若通过
pip
安装,临时解压包路径通常在C:\Users\USER\AppData\Local\Temp\pip-install-xxxx\pynini_xxx
。
-
编辑编译参数:
- 打开
setup.py
或相关编译配置文件(如extensions/_pywrapfst.cpp
的构建配置)。 - 删除或注释包含
-Wno-register
的行。
- 打开
-
重新安装:
pip install --no-cache-dir pynini
3. 降级 Python 版本
某些包尚未适配 Python 3.10 的编译工具链。尝试使用 Python 3.9:
conda create -n py39 python=3.9
conda activate py39
pip install pynini
4. 确保 MSVC 工具链正确配置
- 卸载现有 Visual Studio Build Tools。
- 重新安装时勾选:
- “使用 C++ 的桌面开发”
- “Windows 10/11 SDK”
- “MSVC v143 - VS 2022 C++ x64/x86 生成工具”(与 Python 架构匹配)。
错误原因分析
-Wno-register
是 GCC 的编译参数,用于忽略register
关键字已弃用的警告,但 MSVC 不支持此参数。pynini
的构建脚本未针对 Windows/MSVC 环境做兼容性处理,直接传递了 GCC 参数。
验证是否解决
python -c "import pynini; print(pynini.__version__)"
如果输出版本号,说明安装成功。
附加建议
- 如果项目依赖其他包(如
pyopenjtalk
),同样优先使用 Conda 安装:conda install -c conda-forge pyopenjtalk jieba_fast
- 遇到类似
cl.exe
参数错误时,均可通过 修改源码编译参数 或 使用预编译包 解决。