Имя модуля динамической библиотеки Python отличается от имени файла

В 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, как системный Python под Debian Jessie.

Cdarke, большое спасибо за помощь.


person paugier    schedule 09.06.2015    source источник
comment
См.: stackoverflow.com/questions/13495285/   -  person Hai Vu    schedule 09.06.2015


Ответы (1)


Файлы .so также наверняка написаны на C или C++. В API Python 2 есть функция точки входа, в которой модуль называется, поэтому для модуля с именем «пример»:

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(), но она явно не предназначена для вызова пользователем.

person cdarke    schedule 09.06.2015
comment
Спасибо за imp.get_suffixes(). Однако не похоже, что эти суффиксы установлены в site.py... - person paugier; 09.06.2015
comment
@paugier: да, вы правы, моя информация устарела. Я буду преследовать его. - person cdarke; 09.06.2015