不同于文件名

时间:2015-06-09 13:28:47

标签: python dynamic-library

在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函数,该函数返回带有后缀的元组及其对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多目标作为Debian Jessie下的系统Python。

Cdarke,非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

.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()函数,但显然不是设计用户调用的。