使用另一个python版本或在另一个操作系统上导入cython生成的*.so模块



应该如何在python中导入文件myModule.cpython-35m-x86_64-linux-gnu.so?有可能吗?

我尝试了常规方式:

import myModule

翻译说:

`ModuleNotFoundError: No module named 'myModule'`

这是一个我无法在我正在工作的集群中安装的软件,所以我只是提取了.deb软件包,它没有要安装的轮子文件或结构。

在另一个Python版本中使用为某个Python版本构建的C扩展是有问题的。通常(至少对于Python3(有一种机制可以区分不同Python版本的C扩展,这样它们就可以共存于同一目录中。

在您的示例中,后缀是cpython-35m-x86_64-linux-gnu,因此此C扩展将由x86_64 Linux上的CPython3.5获取。如果您尝试使用另一个Python版本或在另一个平台上导入此扩展,则模块不可见,并且会引发ModuleNotFoundError

可以查看当前Python版本接受哪些后缀,例如:

>>> import _imp
>>>_imp.extension_suffixes()
['.cpython-36m-x86_64-linux-gnu.so', '.abi3.so', '.so']

一种可能性是使用稳定的C-API,它可以与多个Python版本一起使用,而无需重新编译。Cython在3.0版本中开始支持它(请参阅本PR(,也请参阅本关于setuptools和稳定C-API的SO-post。

有人可能想聪明一点,将扩展重命名为简单的.so,这样它就可以被Finder获取-这可以/确实适用于某些平台上的某些Python版本组合以进行某些扩展-但这种方法无法长期维持,而且不是正确的做法。

正确的做法是在正确的操作系统/平台上使用正确的Python-version为/构建C扩展,或者使用正确的轮子(或者使用稳定的C-API(


通常,为python版本(比如说PythonA.B(构建的C扩展不能被另一个python版本(比方说PythonC.D(使用,因为这些扩展/模块链接到一个特殊的python库,并且所需的功能可能不再/尚未存在于另一个版本的库中。

这与*.py文件不同,更类似于不能与其他版本一起使用的*.pyc文件。

虽然PEP-3147对*.pyc-文件的数量进行了调节,但PEP-3149对C扩展也进行了调节。然而,PEP-3149并不是最先进的,因为有些问题只在Python3.5中得到了解决,整个讨论可以在这里找到。

相关内容

  • 没有找到相关文章

最新更新