提问人:mesibo 提问时间:9/22/2023 更新时间:9/22/2023 访问量:23
Cygwin 上的 Python C 扩展模块加载问题
Python C Extension Module loading issue on Cygwin
问:
我们有一个实时消息传递 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
.pyd
ModuleNotFoundError
以下是运行 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 使用的特定扩展,而不必根据系统类型做出假设?
任何见解或解决方案将不胜感激。
多谢!
答: 暂无答案
评论