SWIG и Python3 Ошибка импорта - PullRequest
5 голосов
/ 27 июля 2011

Я написал библиотеку на C. Я использую SWIG для генерации привязок для Java, Python и т. Д. Мне удалось написать пользовательские карты типов для обоих языков и так далее.Мне также удалось использовать свою библиотеку (собственный протокол) и связаться с сервером, который я написал на C, с клиентом, который я написал на Java, и с клиентом, который я пишу на Python.

Недавно я столкнулся с проблемой множественного наследования с решением , которое я нашел умным.Но при попытке повторить ошибку с помощью Python 3 ошибка исчезла ( возможно в версии 3 решена).Дело в том, что один и тот же код, тот же проект и тот же источник не будут запускаться, вызывая двоичный файл python3, но он работает, вызывая двоичный файл python2.7.

Я получаю сообщение:

ImportError: dynamic module does not define init function (PyInit__pytellapic)

Что я уже прочитал, что может означать из документации SWIG с несколько иной ошибкой:

import example
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: dynamic module does not define init function (init_example)

Сказать, что:

Эта ошибка почти всегда возникает, когдаплохое имя присваивается файлу общего доступа.Например, если вы создали файл example.so вместо _example.so, вы получите эту ошибку.Кроме того, эта ошибка может возникнуть, если имя модуля не соответствует имени модуля, указанному в директиве% module.Дважды проверьте интерфейс, чтобы убедиться, что имя модуля и имя файла общего объекта совпадают.Другая возможная причина этой ошибки - забыть связать сгенерированный SWIG-код обертки с остальной частью вашего приложения при создании модуля расширения.

Честно говоря, я думаю, что эти вероятные причины не будут применяться кмои модули, как это должно быть ошибка для 2.7 и 3 версий python, а не только для Python 3.

Буду признателен за любой совет, но, учитывая, что SWIG кажется устаревшим проектом, вероятно, я будупродолжение использования Python 2.7 с упомянутым хаком.

С уважением,

1 Ответ

2 голосов
/ 27 июля 2011

Имеет ли сгенерированный модуль C определенную функцию PyInit__pytellapic?

Имя и профиль, если метод init модуля был изменен в Python 3. Если вы хотите, чтобы один и тот же C-код выполнялся как в Python 2, так и в Python 3, необходимо указать как старое, так и новое имя. См. Главу Миграция C для получения дополнительной информации.

Согласно документации SWIG SWIG 2.0 должен делать это, если вы передаете параметр -py3, но я не пробовал.

...