<p>问题在于每次调用函数时都要初始化和完成pythonshell。(它多次尝试初始化.dll)</p>
<p>编辑:<a href="https://stackoverflow.com/questions/7540808/embedding-python-numpy-code-into-c-dll-callback">Link to resource</a></p>
<p>这是我的解决办法。。。(不是工作的最佳代码)
在你的主楼</p>
<pre><code>int main()
{
double A = 0.4, B = 0.3, t = 0.1, x = 0.0;
bool Stop = false;
root_(&A,&B,&t,&x,&Stop);
printf("x = %.15f\n", x);
Stop=true;
root_(&A,&B,&t,&x,&Stop);
printf("x = %.15f\n", x);
return 0;
}
</code></pre>
<p>然后在你的根C.h</p>
^{pr2}$
<p>然后在rootC.c</p>
<pre><code>#include "rootC.h"
#include <Python.h>
void root_(double* A, double* B, double* t, double* x,bool* Stop)
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue, *sys, *path;
if (*Stop==false)
{
Py_Initialize();
}
sys = PyImport_ImportModule("sys");
path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));
pName = PyString_FromString("rootPY");
pModule = PyImport_Import(pName);
if (!pModule)
{
PyErr_Print();
printf("ERROR in pModule\n");
exit(1);
}
pFunc = PyObject_GetAttrString(pModule, "root");
pArgs = PyTuple_New(3);
PyTuple_SetItem(pArgs, 0, PyFloat_FromDouble((*A)));
PyTuple_SetItem(pArgs, 1, PyFloat_FromDouble((*B)));
PyTuple_SetItem(pArgs, 2, PyFloat_FromDouble((*t)));
pValue = PyObject_CallObject(pFunc, pArgs);
*x = PyFloat_AsDouble(pValue);
if (*Stop==true)
{
Py_Finalize();
}
}
</code></pre>
<p>这应该行得通:)</p>