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
中发现了相关行。在构建过程中使用了两个宏,VERSION
和 SOVERSION
。在我看来,差异是因为蟒蛇是以不同的方式建造的。我认为答案是在每个平台上从源代码构建模块。
我给出的关于site.py
的原始信息来自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我没有测试过。
有一个未记录的 imputil.add_suffix()
函数,但显然不是为用户调用而设计的。
在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
中发现了相关行。在构建过程中使用了两个宏,VERSION
和 SOVERSION
。在我看来,差异是因为蟒蛇是以不同的方式建造的。我认为答案是在每个平台上从源代码构建模块。
我给出的关于site.py
的原始信息来自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我没有测试过。
有一个未记录的 imputil.add_suffix()
函数,但显然不是为用户调用而设计的。