c программа SWIG на python выдает «ImportError: динамический модуль не определяет функцию инициализации» - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать программу .c в сценарии Python с SWIG.Для начала я установил SWIG и попробовал простой пример из учебника swig webpage .

Я использую Raspberry Pi с Raspbian GNU / Linux 9.4 (растяжение)

Вот что я делаю:
1. swig -python example.i - отлично, это создало два новых файла: 'example.py 'и' example_wrap.c '
2. gcc -fpic -I/usr/include/python2.7 -c example_wrap.c - это создает файл' example_wrap.o '
3. скомпилируйте example.c в Geany;это дает файл 'example.o'
4. gcc -shared example.o example_wrap.o -o example.so - теперь создается новый файл 'example.so'.
Время попробовать:

python

Я использую Python2.7.13 здесь

>>>import example

И это дает трассировку:

File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initexample)

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Это то, что происходит с динамическим модулем Python (по крайней мере, в текущей версии swig ):

  • Имя модуля (давайте придерживаться пример , как в учебном пособии) указывается в файле .i : %module example
  • Во время сборки создаются 2 файла:
    • _ $ {MODULE_NAME} .so : динамический модуль или общий объект с именем, которому в имени модуля предшествует подчеркивание , в нашем примере _example.so , который содержит фактический C скомпилированный код
    • $ {MODULE_NAME} .py : который является оберткой над предыдущим; example.py - это модуль "точка входа"

A Python динамический модуль должен реализовывать init * функция, как описано в [Python 2]: таблица методов модуля и функция инициализации и другие: что следует после части init , должен соответствовать имени модуля ( .so ) (в нашем случае это init_example ).

При присвоении имени динамическому модулю example.so , когда Python пытался загрузить его, он искал initexample , который (очевидно) не существовал, вызывая ImportError .

Изменение имени модуля на _example.so (gcc -shared example.o example_wrap.o -o _example.so), поскольку URL также указывает, больше не вызывает исключение.

Затем функции доступны следующим образом:

>>> import example  # This imports example.py which automatically imports _example.so
>>> example.fact(4), example.my_mod(7, 2), example.get_time()
0 голосов
/ 25 апреля 2018

Как сказал CristiFati "gcc -shared example.o example_wrap.o -o _example.so"

Неверное имя и причина ошибки.

...