MSYS2 UCRT64环境下Windows平台无法导入pybind11编译的.pyd Python模块问题求助
各位好,我最近在折腾一个用pybind11封装的C++项目,Linux下一切顺畅——CMake编译的测试exe能正常跑,Python模块导入没毛病,用pip安装也完全正常。但到了Windows上用MSYS2 UCRT64环境编译时,就碰到了一堆头疼的问题,折腾好几天没搞定,想请教下大家的思路。
先说说目前的情况和我试过的操作:
编译与文件准备:
编译是能成功生成.pyd文件的,我在项目根目录建了个symreg文件夹,把.pyd、所有依赖的DLL(比如libarmadillo.dll、libceres-4.dll这些)都复制进去,还加了__init__.py,内容就一行:from .symreg import *。第一次导入错误:
不管是在MSYS2 UCRT64的Python交互环境里,还是直接用CMD调用MSYS2的Python,执行import symreg都会报:ModuleNotFoundError: No module named 'symreg.symreg'我确认过文件夹里的文件是全的,列表如下:
symreg/ ├── __init__.py ├── __pycache__ ├── libarmadillo.dll ├── libblas.dll ├── libceres-4.dll ├── libgcc_s_seh-1.dll ├── libglog-2.dll ├── libgvc-6.dll ├── libopenblas.dll ├── libstdc++-6.dll ├── libwinpthread-1.dll ├── zlib1.dll └── symreg.cp312-win_amd64.pyd修改.pyd命名后的错误:
我注意到site-packages里的gmpy2模块的.pyd命名是gmpy2.cp312-mingw_x86_64_ucrt_gnu.pyd,于是试着把我的.pyd文件也改成symreg.cp312-mingw_x86_64_ucrt_gnu.pyd,结果错误变成了:ImportError: DLL load failed while importing symreg: Le module spécifié est introuvable.(翻译过来就是“指定的模块找不到”)
Python DLL的问题:
我排查依赖时发现,系统提示需要python312.dll,但MSYS2 UCRT64的bin目录里只有libpython3.12.dll和libpython.dll。我抱着试试的心态把libpython3.12.dll重命名成python312.dll放到模块文件夹里,结果导入直接触发了段错误(segmentation fault),直接崩了。
另外还有个小细节:编译出来的测试exe,在MSYS2 UCRT64的终端里跑不了,必须放到CMD里才能启动,不知道这个和模块导入的问题是不是有什么关联。我也已经把api-ms-win-crt-*.dll这类系统级DLL都加到文件夹里了,但还是没解决问题。
想请教大家几个问题:
- 是不是MSYS2环境下编译的.pyd有特殊的命名规范?我之前的命名是不是不符合Python的识别规则?
- DLL依赖的排查除了看系统提示,有没有更靠谱的工具或者方法能找出到底缺哪个模块?
- 针对MSYS2 UCRT64环境,Python模块导入还有什么特殊的注意事项吗?
- 等模块能正常导入后,怎么才能用pip正常安装这个模块,让其他Python脚本也能直接调用?
内容来源于stack exchange




