更新:
所以我已经按照docs使用setup.py as shown in section 4.1 here的方式编译了C ++代码,并且好像导入后我查询assignment1.add?
时模块已成功导入信息:
文档字符串:加两个数字。
类型: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;
}
关于我应该在哪里寻找问题原因的任何建议?
答案 0 :(得分:0)
您的第一次尝试使用Python3 API。我不确定“链接器错误1120”是什么,所以不会查找它,但是我的猜测是未定义的引用,如果您尝试使用Python2.7(为什么呢?),这是完全可以理解的。Python2和Python3具有不兼容的C API。
第二次尝试使用Python2.7。您复制的示例是错误的。初始化名为module
的模块的init函数应称为initmodule
,而不是initmod
。但是,等等,还有更多!您尚未逐字复制。您已将文件“ module.c”重命名为“ assignment1.c”,但忽略了更改模块名称字符串或init函数字符串的方法,和将您的python文件称为假定的模块“ assignment1”,该模块不存在。名为assignment1
的模块应位于名为assignment1.<your library extension>
的库中,并具有名为initassignment1
的初始化函数。您创建的库不能用作Python模块。我的猜测是您的Python模块assignment1.py
已经导入了自身,当然它没有任何名为sum
的东西。
Live demo of the fixed module。
所有这些与从Python调用C ++函数完全无关。只需使用pybind11。