Обновлять:
Итак, я получил свой код 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;
}
Любые предложения относительно того, где я должен искать причину проблемы?
Это не особенно полезный ответ. У меня раньше работало вышеперечисленное, и я понятия не имею, почему это не работает сейчас, я знал о boost, который, как утверждает pybind, является облегченной версией, прежде чем спрашивать. Я бы предпочел понять, в чем здесь проблема.






Ваша первая попытка использует 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, чтобы избежать проблемы с самостоятельным импортом. Я хотел бы, чтобы это работало с основ, я понимаю, что есть доступные библиотеки. Буду признателен за любые ваши дополнительные советы. Спасибо.
Я не знаю, что там бороться. Получите pybind11. Прочтите документы. Сделанный.