【问题标题】:Name of Python dynamic library module different than file namePython动态库模块的名称与文件名不同
【发布时间】:2015-06-09 13:28:46
【问题描述】:

在 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 以获得作为 Debian Jessie 下的系统 Python 的 Python 多架构。

Cdarke,非常感谢您的帮助。

【问题讨论】:

标签: python dynamic-library


【解决方案1】:

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

【讨论】:

  • 感谢imp.get_suffixes()。但是,site.py中似乎没有设置这些后缀...
  • @paugier:是的,你是对的,我的信息已经过时了。我会追的。
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多