Невозможно импортировать модуль Python, написанный на C

Я пытался понять, как сделать .pyd (Модуль расширения Python) из сценария C (без swig или чего-либо еще, кроме MinGW) и успешно встроил его в .pyd,

Проблема, однако, возникает, когда я пытаюсь импортировать модуль.

Если я запускаю его, модуль работает успешно (насколько я вижу), а затем появляется ошибка, говорящая Python Has Stopped Working и он закрывается без выполнения остальной части программы.

Вот мой C-скрипт (test.c):

#include <python.h>

int main()
{
    PyInit_test();
    return 0;
}

int PyInit_test()
{
    printf("hello world");
}

И Python Script (file.py):

import test
print('Run From Python Extension')

Я скомпилировал скрипт с:

gcc -c file.py
gcc -shared -o test.pyd test.c

Я не могу найти никаких ошибок при компиляции в командной строке, и я использую Python 3.6 (работает на Windows 10).

Я не могу найти много по этому вопросу и предпочел бы держаться подальше от Cython (я уже знаю C) и Swig.

Любая помощь, чтобы сказать мне, что не так, была бы фантастической.

1 ответ

Решение

Создание расширения Python полностью отличается от написания обычного C-кода. То, что вы сделали, это просто создали правильную программу на C, но это не имеет смысла для Python.

Вот как должна выглядеть ваша программа (это просто скелет, а не правильный рабочий код):

#include <Python.h>
#include <stdlib.h>

static PyObject* test(PyObject* self, PyObject* args)
{
    printf("hello world");
    return NULL;
}

static PyMethodDef test_methods[] = {
    {"test", test, METH_VARARGS, "My test method."},
    {NULL, NULL, 0, NULL} /* Sentinel */
};

PyMODINIT_FUNC init_test_methods() {
    Py_InitModule("test", test_methods);
}

int main(int argc, char** argv)
{
    /* Pass argv[0] to the Python interpreter */
    Py_SetProgramName(argv[0]);

    /* Initialize the Python interpreter. Required. */
    Py_Initialize();

    /* Add a static module */
    init_test_methods();
}

Я рекомендую вам прочитать больше об этом по следующей ссылке: http://dan.iel.fm/posts/python-c-extensions/ а также в официальных документах.

Другие вопросы по тегам