在Python中,模块的名称通常与相应文件的名称相同,但是我遇到了与模块无关的问题,事实并非如此:
1
2
3
4
5
6me@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)一起使用,但找不到该模块:
1
2
3
4
5
6
7
8me@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"", line 1, in
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
1[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]
和/ usr / lib / python
1[('.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提供哪些选项以获取Debian Jessie下的Python多体系结构作为Python系统。
Cdarke,非常感谢您的帮助。
请参阅:stackoverflow.com/questions/13495285/
.so文件当然也可以用C或C ++编写。在Python 2 API中,有一个入口点函数在其中命名模块,因此对于名为" example"的模块:
1
2
3
4PyMODINIT_FUNC initexample(void)
{
(void)Py_InitModule("example", ExampleMethods);
}
Py_InitModule的第二个参数是方法数组的名称-基本上是C函数名称的列表。 .so文件与Python27运行时库链接。
那么Python如何知道要使用哪些后缀?您可以使用以下方法找到这些:
1
2import imp
print imp.get_suffixes()
这将显示系统上模块的有效后缀(imp模块的文档具有指导意义)。
编辑:
在深入研究了源代码等之后,我发现了configure.ac中的相关行。在构建期间使用了两个宏,VERSION和SOVERSION。在我看来,差异是因为python是用不同的方式构建的。我认为答案是在每个平台上从源代码构建模块。
我提供的有关site.py的原始信息来自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我尚未对其进行测试。
有一个未公开的imputil.add_suffix()函数,但是显然不是设计用来由用户调用的。
感谢您的imp.get_suffixes()。 但是,似乎这些后缀未在site.py中设置...
@paugier:是的,您是对的,我的信息已经过时了。 我会追逐