Python 动态库模块的名称与文件名不同

Name of Python dynamic library module different than file name

在Python中,模块的名称通常与对应文件的名称相同,但我有一个模块的问题不是这样:

me@host:/usr/lib/python2.7/dist-packages/paraview$ ls vtkCommonCorePython*
vtkCommonCorePython.x86_64-linux-gnu.so

me@host:/usr/lib/python2.7/dist-packages/paraview$ python -c \
    "import vtkCommonCorePython; print(vtkCommonCorePython.__file__)"
vtkCommonCorePython.x86_64-linux-gnu.so

它是如何工作的?

我的问题是我尝试将此模块与另一个 Python (/opt/python/2.7.9/bin/python) 一起使用,但它找不到模块:

me@host:/usr/lib/python2.7/dist-packages/paraview$ module load python/2.7.9 
--- Loading module environment: python/2.7.9
------------------------------------------------
me@host:/usr/lib/python2.7/dist-packages/paraview$ python -c \
    "import vtkCommonCorePython; print(vtkCommonCorePython.__file__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named vtkCommonCorePython

备注:/usr/lib/python2.7/lib-dynload中的大部分文件也以x86_64-linux-gnu.so结尾,而/opt/python/2.7.9/lib/python2.7/lib-dynload中的文件只是以.so结尾。

cdarke 回答后更新:

cdarke 提到了 imp.get_suffixes 函数,它 returns 一个带有后缀的元组及其对 Python 的含义:

和/opt/python/2.7.9/bin/python

[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

和 /usr/lib/python

[('.x86_64-linux-gnu.so', 'rb', 3), ('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

这种差异解释了为什么我会收到错误,但这些后缀似乎没有设置在 site.py 中(如 cdarke 所写)并且没有函数 imp.set_suffixes.

所以要解决这个问题,我需要知道如何设置这些后缀。

更新 2

所以好像后缀被编码成一个二进制Python文件,意思是Python构建后就没法修改了。因此,解决问题的最干净的方法是重建 opt Python,从而了解为 configure 提供哪些选项以获得 Python 多体系结构作为系统 Python 在 Debian Jessie 下。

Cdarke,非常感谢您的帮助。

.so文件当然也是用C或C++写的。在 Python 2 API 中有一个模块命名的入口点函数,因此对于名为 "example" 的模块:

PyMODINIT_FUNC initexample(void)
{
    (void)Py_InitModule("example", ExampleMethods);
}

Py_InitModule 的第二个参数是方法数组的名称——基本上是 C 函数名称的列表。 .so 文件与 Python27 运行 时间库链接。

那么 Python 如何知道要使用哪些后缀?您可以使用以下方法找到这些:

import imp
print imp.get_suffixes()

这将显示系统上模块的有效后缀(imp 模块的文档具有指导意义)。

编辑:

在深入研究源代码等之后,我在 configure.ac 中发现了相关行。在构建过程中使用了两个宏,VERSIONSOVERSION。在我看来,差异是因为蟒蛇是以不同的方式建造的。我认为答案是在每个平台上从源代码构建模块。

我给出的关于site.py的原始信息来自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我没有测试过。

有一个未记录的 imputil.add_suffix() 函数,但显然不是为用户调用而设计的。