Вызов функций C++ из Python (Anaconda)

Обновлять:

Итак, я получил свой код C++ для компиляции в соответствии с документы с использованием setup.py, как показано в разделе 4.1 здесь, и кажется, что модуль успешно импортируется, так как когда я запрашиваю assignment1.add? после импорта, я получаю информацию:

Docstring: Add two numbers.

Type: builtin_function_or_method

Однако, когда я на самом деле вызываю функцию assignment1.sum(1,2), ядро ​​​​Python немедленно умирает без дальнейшего сообщения об ошибке, кроме «Ядро умерло, перезагружается».

#include <Python.h>

static PyObject * assignment1_add(PyObject *self, PyObject *args)
{
    int *a, *b;
    int sum;

    if (!PyArg_ParseTuple(args, "ii", &a, &b))
        return NULL;
    sum = *a + *b;
    return PyLong_FromLong(sum);
}

static PyMethodDef Assignment1Methods[] = {
    {"add",  assignment1_add, METH_VARARGS, "Add two numbers."},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

static struct PyModuleDef assignment1module = {
    PyModuleDef_HEAD_INIT,
    "assignment1",   /* name of module */
    NULL, /* module documentation, may be NULL */
    -1,       /* size of per-interpreter state of the module,
              or -1 if the module keeps state in global variables. */
    Assignment1Methods
};

PyMODINIT_FUNC PyInit_assignment1(void)
{
    PyObject *m;

    m = PyModule_Create(&assignment1module);
    if (m == NULL)
        return NULL;
    return m;
}

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }

    /* Add a built-in module, before Py_Initialize */
    PyImport_AppendInittab("assignment1", PyInit_assignment1);

    /* Pass argv[0] to the Python interpreter */
    Py_SetProgramName(program);

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

    /* Optionally import the module; alternatively,
    import can be deferred until the embedded script
    imports it. */
    PyImport_ImportModule("assignment1");

    PyMem_RawFree(program);
    return 0;
}

Любые предложения относительно того, где я должен искать причину проблемы?

Я не знаю, что там бороться. Получите pybind11. Прочтите документы. Сделанный.

n. 1.8e9-where's-my-share m. 18.02.2019 14:35

Это не особенно полезный ответ. У меня раньше работало вышеперечисленное, и я понятия не имею, почему это не работает сейчас, я знал о boost, который, как утверждает pybind, является облегченной версией, прежде чем спрашивать. Я бы предпочел понять, в чем здесь проблема.

JPI 18.02.2019 14:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
680
1

Ответы 1

Ваша первая попытка использует Python3 API. Я не уверен, что такое «ошибка компоновщика 1120», не собираюсь ее искать, но я предполагаю, что это неопределенная ссылка, что вполне понятно, если вы пытаетесь использовать Python2.7 (кстати, почему?) Python2 и Python3 имеют разные несовместимые C API.

Вторая попытка использует Python2.7. Пример, который вы скопировали, неверен. Функция инициализации для инициализации модуля с именем module должна называться initmodule, а не initmod. Но подождите, есть еще! Вы не дословно скопировали. Вы переименовали файл «module.c» в «assignment1.c», но забыли изменить строку имени модуля или строку функции инициализации, и вы назвали свой файл python так же, как и предполагаемый модуль «assignment1», которого не существует. Модуль с именем assignment1 должен находиться в библиотеке с именем assignment1.<your library extension> и иметь функцию инициализации с именем initassignment1. Созданную вами библиотеку нельзя использовать в качестве модуля Python. Я предполагаю, что ваш модуль Python assignment1.py импортировал себя, и, конечно же, у него нет ничего с именем sum.

Живая демонстрация фиксированного модуля.

Все это совершенно не имеет значения для вызова функций C++ из Python. Просто используйте pybind11.

Здравствуйте, я более внимательно просмотрел документы и переделал свой пример Python 3. Теперь он успешно компилируется и импортируется нормально (так кажется), но ядро ​​​​вылетает, когда я пытаюсь вызвать свою функцию. Я не знал, что во втором примере используется Python 2, извините. Я переименовал Assignment1.py, чтобы избежать проблемы с самостоятельным импортом. Я хотел бы, чтобы это работало с основ, я понимаю, что есть доступные библиотеки. Буду признателен за любые ваши дополнительные советы. Спасибо.

JPI 19.02.2019 23:23

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