如果我理解得很好,你不喜欢像 c => python 或像 python => c 这样的对话。
在这种情况下,我会推荐Cython。它对多种操作非常开放,特别是在您的情况下,从 C 调用一个用 Python 编写的函数。
这是它的工作原理(public api):
下面的例子假设你有一个 Python 类(self 是它的一个实例),并且这个类有一个你想要调用这个类并处理结果的方法(名称method)(这里是来自 C 的 double)。这个函数,写在 Cython extension 中,可以帮助你完成这个调用。
cdef public api double cy_call_func_double(object self, char* method, bint *error):
if (hasattr(self, method)):
error[0] = 0
return getattr(self, method)();
else:
error[0] = 1
在 C 端,您将能够像这样执行调用:
PyObject *py_obj = ....
...
if (py_obj) {
int error;
double result;
result = cy_call_func_double(py_obj, (char*)"initSimulation", &error);
cout << "Do something with the result : " << result << endl;
}
PyObject 是 Python/C API 提供的struct
在捕捉到py_obj 之后(通过在你的cython 扩展中投射一个普通的python object,像这样:<PyObject *>my_python_object),你终于可以在它上面调用initSimulation 方法并对结果做一些事情。
(这里是double,但Cython 可以轻松处理vectors, sets, ...)
好吧,我知道如果您从未使用 Cython 写过任何东西,我刚刚写的内容可能会令人困惑,但它旨在简短地展示它可以在 合并方面为您做的许多事情。
另一方面,与将 Python 代码重新编码为 C 相比,这种方法可能需要更多时间,具体取决于算法的复杂性。
在我看来,只有当你计划经常有这种需求时,花时间学习 Cython 才是相关的......
希望这至少能提供一些信息......