Cygwin 上的 Python C 扩展模块加载问题

Python C Extension Module loading issue on Cygwin

提问人:mesibo 提问时间:9/22/2023 更新时间:9/22/2023 访问量:23

问:

我们有一个实时消息传递 Python 模块,可在各种平台上使用,包括 Linux、macOS、Windows 和 Raspberry Pi。它是用 C/C++ 编写的,并且在这些平台上一直正常工作。

最近,我们的一位用户在尝试在 Cygwin 上使用它时遇到了这个问题。ModuleNotFoundError

ModuleNotFoundError: No module named '_mesibo'

经过调查,我们发现在 Cygwin 上运行的 Python 版本没有按照 Python 官方文档中的建议使用正确的 DLL 扩展名。根据 Python 的文档:

CPython 的 C 扩展名是一个共享库(例如,.so 文件 Linux,Windows 上的 .pyd),用于导出初始化函数。

要导入,共享库必须在 PYTHONPATH 上可用, 并且必须以模块名称命名,并具有适当的 扩展。

我们遵循了此文档,并按照 Windows 的建议使用了扩展。它适用于与 Windows 捆绑的 Python 版本,以及从 Python 网站下载时。但是,Cygwin 上的 Python 似乎正在使用扩展而不是,因此无法找到导致 的模块,如以下日志所示:.pyd.dll.pydModuleNotFoundError

以下是运行 Cygwin 版本时的日志,如您所见,它正在尝试查找扩展名为 .dll (_mesibo.dll) 而不是 .pyd (_mesibo.pyd) 的模块

[/cygdrive/c/python] $ python -vvvv test.py
...
# trying /usr/local/lib/python3.9/site-packages/mesibo/_mesibo.cpython-39-x86_64-cygwin.dll
# trying /usr/local/lib/python3.9/site-packages/mesibo/_mesibo.abi3.dll
# trying /usr/local/lib/python3.9/site-packages/mesibo/_mesibo.dll
...

相反,在带有 Windows 的 Python 捆绑包上,或者当我们从 Python 网站下载和安装时,会正确查找并加载 _mesibo.pyd

C:\mesibo > python -vvvv test.py
...
# trying 
C:\Users\Grace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mesibo\_mesibo.cp311-win_amd64.pyd
# trying C:\Users\Grace\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mesibo\_mesibo.pyd

虽然我们能够通过手动将 .pyd 重命名为 Cygwin 的 .dll 来暂时解决这个问题,但我们怀疑这是否是正确且面向未来的解决方案。

知道为什么Cygwin使用.dll扩展名而不是Python官方文档推荐的.pyd扩展名吗?此外,有没有办法在运行时知道特定版本的 Python 使用的特定扩展,而不必根据系统类型做出假设?

任何见解或解决方案将不胜感激。

多谢!

蟒蛇 python-3.x cygwin mesibo

评论

1赞 Doug Henderson 9/22/2023
Cygwin 在 Windows 上运行,但不是 Windows。这是一个 POSIX 环境,其中包括 Python 扩展在内的共享库使用 .DLL 扩展。尝试重命名文件,看看是否有效。

答: 暂无答案