在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提到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
。
所以要解决这个问题,我需要知道如何设置这些后缀。
因此似乎后缀被编码为二进制Python文件,这意味着在构建Python之后无法修改它。因此,解决问题的最简洁方法是重建opt Python,从而了解哪些选项可以提供给configure
以获得Python多目标作为Debian Jessie下的系统Python。
Cdarke,非常感谢你的帮助。
答案 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
中发现了相关的行。在构建期间使用两个宏VERSION
和SOVERSION
。在我看来,差异是因为蟒蛇以不同的方式建造。我认为答案是在每个平台上从源代码构建模块。
我提供的有关site.py
的原始信息来自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我尚未对其进行测试。
有一个未记录的imputil.add_suffix()
函数,但显然不是设计用户调用的。