从Python(Anaconda)调用C ++函数

时间:2019-02-18 13:23:12

标签: python c++ python-3.7

更新:

所以我已经按照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;
}

关于我应该在哪里寻找问题原因的任何建议?

1 个答案:

答案 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。