Оберните библиотеку c только с помощью python

Мне предоставили библиотеку c wave.so с определенной функцией интерфейса, я следую руководству здесь

https://stackoverflow.com/a/5868051/2789784

и это работает. Однако, когда я сделал скрипт файлом MyModule.py и попытался импортировать

import MyModule

Затем он дает мне эту ошибку.

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

Почему это происходит? Как мне это исправить?

ИСПРАВЛЕНО: поэтому у меня есть и MyModule.py, и MyModule.so в одной папке, python пытался загрузить MyModule.so вместо MyModule.py, и, конечно, он не может быть успешным, измените имя MyModule.py на wave.py а также

import wave 

решает проблему. Так что в основном, если вы просто хотите вызвать какую-то библиотечную функцию C++, вам действительно нужна оболочка скрипта python и все, никакого программирования на C. И я могу использовать свою общую библиотеку С++ для другого приложения.


person user40129    schedule 26.09.2013    source источник
comment
Ваш .so также называется MyModule.so? Это объяснило бы, что Python выбирает не тот файл.   -  person millimoose    schedule 26.09.2013
comment
Ха-ха, вы правы, я просто вернулся, чтобы попытаться исправить свою глупость, прежде чем кто-то другой это заметит, и вот вы, замечаете это.   -  person user40129    schedule 26.09.2013


Ответы (1)


Когда вы пишете модуль расширения на C, должна быть функция инициализации модуля. Если ваш модуль называется wave, в модуле расширения должна быть функция с именем initwave. Простой пример:

static PyMethodDef methods[] = {
    /* methods go here, if any */
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initwave(void){
Py_InitModule3("wave", methods, "this is the doc string");
}

Затем скомпилируйте расширение с чем-то вроде:

Extension('wave',
    ['source_file.c', 'another_source_file.c'],
)

Модуль расширения, который вы можете импортировать, называется wave.so (я не знаю, безопасно ли его переименование, но это определенно не очень хорошая идея). В вашем скрипте Python MyModule.py просто выполните:

import wave 
person dastrobu    schedule 26.09.2013
comment
Следуя этому руководству, я смог вызвать функцию в wave.so без написания кода на C. Почему нельзя просто написать какую-нибудь функцию-оболочку на python и использовать ее как мой файл module.py и импортировать. - person user40129; 26.09.2013
comment
Вы можете, написав оболочку Cython, как описано в вашей ссылке, или вы можете просто использовать ctypes. Во всяком случае, ваше цитируемое сообщение об ошибке указывает на то, что в какой-то момент Python предполагает, что wave.so является расширением Python C, а это не так. Как это происходит, я не могу сказать из предоставленной информации. Постарайтесь сузить проблему и предоставить дополнительную информацию, которая облегчит помощь. - person dastrobu; 26.09.2013