You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MSYS2 UCRT64环境下Windows平台无法导入pybind11编译的.pyd Python模块问题求助

MSYS2 UCRT64环境下Windows平台无法导入pybind11编译的.pyd Python模块问题求助

各位好,我最近在折腾一个用pybind11封装的C++项目,Linux下一切顺畅——CMake编译的测试exe能正常跑,Python模块导入没毛病,用pip安装也完全正常。但到了Windows上用MSYS2 UCRT64环境编译时,就碰到了一堆头疼的问题,折腾好几天没搞定,想请教下大家的思路。

先说说目前的情况和我试过的操作:

  1. 编译与文件准备
    编译是能成功生成.pyd文件的,我在项目根目录建了个symreg文件夹,把.pyd、所有依赖的DLL(比如libarmadillo.dll、libceres-4.dll这些)都复制进去,还加了__init__.py,内容就一行:from .symreg import *

  2. 第一次导入错误
    不管是在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
    
  3. 修改.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.
    

    (翻译过来就是“指定的模块找不到”)

  4. Python DLL的问题
    我排查依赖时发现,系统提示需要python312.dll,但MSYS2 UCRT64的bin目录里只有libpython3.12.dlllibpython.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

火山引擎 最新活动