gpt4 book ai didi

c++ - 具有多个函数的 Py_InitModule - 从 int 到 PyCFunction 的无效转换

转载 作者:行者123 更新时间:2023-11-30 05:41:54 25 4
gpt4 key购买 nike

我正在过渡到删除代码中的 boost-python 依赖项,并且我已经完成了此过渡的“最后一步”(我删除了所有其他 boost 依赖项,当我注释掉下面的 boost 代码时,我得到ImportError: 动态模块没有定义初始化函数 (initMy_module)。

下面是代码

#include <boost/python.hpp>
namespace bpn = boost::python::numeric;
using namespace boost::python;
BOOST_PYTHON_MODULE(My_module)
{
using namespace bpn;
import_array();
array::set_module_and_type("numpy", "ndarray");

register_exception_translator<int>(&translator);

def("run_My_module", run_My_module, "run my moduule");
def("run_My_module_another_way", run_My_module_another_way, "run my module another way");
}

根据我对 python/C API 的理解,我认为以下代码应该表面上链接了我的 C 和 Python 代码。

static PyMethodDef myModule_methods[] = {
{"run_My_module", run_My_module, METH_VARARGS},
{"run_My_module_another_way", run_My_module_another_way, METH_VARARGS},
{NULL, NULL}
};

void initmyModule(void)
{
// Init module.
(void) Py_InitModule("myModule", myModule_methods);

}

但是,这会产生以下错误:

myModule_python_binding.cpp:126:5: error: invalid conversion from 'int (*)(char*, char*, char*, PyObject*) {aka int (*)(char*, char*, char*, _object*)}' to 'PyCFunction {aka _object* (*)(_object*, _object*)}' [-fpermissive]
};
^
myModule_python_binding.cpp:126:5: error: invalid conversion from 'int (*)(char*, ompi_communicator_t*&, char*, char*, PyObject*) {aka int (*)(char*, ompi_communicator_t*&, char*, char*, _object*)}' to 'PyCFunction {aka _object* (*)(_object*, _object*)}' [-fpermissive]

两个函数都是这种形式。他们都返回表示成功程度的整数。

int run_myModule(char *infile, char *outfile, char *errfile, pyObject *exc)
{...};

int run_myModule_another_way(char *infile, int &_exvar, char *outfile, char *errfile, pyObject *exc)
{...};

为什么我的“表面”连接失败了?

最佳答案

您收到编译时错误,因为您在 myModule_methods[] 中使用的函数指针的类型/签名错误。要直接从 Python 调用的函数需要具有以下签名:

PyObject *foo(PyObject *self, PyObject *args)

所以如果你想从 Python 调用你的 run_my_Modulerun_my_Module_another_way 函数,你需要通过将它们包装在一个具有上述签名的函数。例如:

static PyObject *run_My_module_wrapper(PyObject *self, PyObject *args)
{
// Parse arguments from Python out of the args parameter using
// PyArg_ParseTuple. i.e. somthing like:
const char *infile, *outfile, *errfile;
PyObject *exc;

if (!PyArg_ParseTuple(args, "sssO", &infile, &outfile, &errfile, &exc)) {
return NULL; // Invalid arguments
}

//
// Now you can call your function with the arguments from the Python call.
//
int r = run_My_module(infile, outfile, errfile, exc);

if (r == SUCCESSFUL_VALUE) {
Py_RETURN_NONE;
}
else {
return NULL;
}
}

// Similar setup for run_My_module_another_way.

static PyMethodDef myModule_methods[] = {
{"run_My_module", run_My_module_wrapper, METH_VARARGS},
{"run_My_module_another_way", run_My_module_another_way_wrapper, METH_VARARGS},
{NULL, NULL}
};

void initmyModule(void)
{
// Init module.
(void) Py_InitModule("myModule", myModule_methods);

}

参见 Parsing Arguments有关解析从 Python 传入的参数的更多信息。加上 Extending and Embedding the Python Interpreter获取您需要的所有一般信息。

关于c++ - 具有多个函数的 Py_InitModule - 从 int 到 PyCFunction 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com