Что такое функция инициализации динамического модуля в python?

Я получаю ту же ошибку этих двух других вопросов: ImportError: динамический модуль не определяет функцию инициализации, но определяет и Скомпилированное на Cython расширение C: ImportError: динамический модуль не определяет функцию инициализации

Но их решения не равны и у меня тоже не сработали.

Я пытаюсь вызвать функции общей библиотеки, которую я написал на c, внутри моей программы на python.

Я скомпилировал свою общую библиотеку следующим образом:

gcc -shared -Wl,-soname,playfaircrack.so -o playfaircrack.so -fPIC playfaircrack.c scoreText.o

Я создал модуль, и внутри этого модуля я загружаю эту библиотеку с помощью:

cracker = ctypes.cdll.LoadLibrary('./playfaircrack.so')

Но когда я запускаю код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "playfair.py", line 2, in <module>
    import playfaircrack
ImportError: dynamic module does not define init function (initplayfaircrack)

Что очень странно, потому что если я запускаю интерпретатор Python и вызываю напрямую:

cracker = ctypes.cdll.LoadLibrary('./playfaircrack.so')

Я могу получить доступ к функциям моей общей библиотеки.

Есть идеи, как это решить? Спасибо.


person Lucas Radaelli    schedule 04.06.2013    source источник


Ответы (1)


Удалить строку

import playfaircrack

в playfair.py и это должно работать.

Либо переименуйте playfaircrack.so во что-то другое или переместите его в другой каталог. Python запутается, если у вас есть два файла с одинаковым именем модуля, то есть playfaircrack.py и playfaircrack.so в одном каталоге. Python пытается импортировать playfaircrack.so, который не является допустимым модулем Python, прежде чем он доберется до playfaircrack.py.

person Mike Müller    schedule 04.06.2013
comment
Хорошо. Я просто не могу этого сделать, потому что playfair — это основная программа, а playfaircrack — это модуль, вызываемый из основной программы. - person Lucas Radaelli; 04.06.2013
comment
Мне никогда не приходило в голову что-то подобное. Это сработало. Спасибо :) - person Lucas Radaelli; 04.06.2013