2012-11-26 23 views
6

私はPythonプログラムをC++コードに埋め込もうとしています。私が持っている問題は、numpyのインポートを含むpythonスクリプトを使用することです。 例えば、私は次のC++コード機能derivePythonをC言語に埋め込むとNumpyのインポートが失敗する

それが正しく実行さ
def derive(x,xp,dt,y,yp,dz): 
return log(abs(x - xp)/dt),exp((y-yp)/dz) 

が含まれていますが、log.pyはfrom numpy import arrayが含まれている場合は、次のlog.pyスクリプトで

#include <Python.h> 
int main(int argc,char *argv[]) 
{ 
double 
    x=2., 
    xp=4., 
    dt=6., 
    y=8, 
    yp=1, 
    dz=6; 
Py_Initialize(); 

PyObject* myModuleString = PyString_FromString((char*)"log"); 
PyObject* myModule = PyImport_Import(myModuleString); 


PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"derive"); 
PyObject* args = PyTuple_Pack( 6, 
PyFloat_FromDouble(x), 
PyFloat_FromDouble(xp), 
PyFloat_FromDouble(dt), 
PyFloat_FromDouble(y), 
PyFloat_FromDouble(yp), 
PyFloat_FromDouble(dz)); 

PyObject* myResult = PyObject_CallObject(myFunction, args); 

PyObject *ts= PyTuple_GetItem(myResult,0); 
PyObject *zs= PyTuple_GetItem(myResult,1); 
double result_t = PyFloat_AsDouble(ts); 
double result_z = PyFloat_AsDouble(zs); 
printf("%3f \n %f \n", result_t,result_z); 

Py_Finalize(); 

system("pause"); 

return 0; 
} 

を使用している場合、それは失敗する

from numpy import array 
def derive(x,xp,dt,y,yp,dz): 
return log(abs(x - xp)/dt),exp((y-yp)/dz) 

答えて

2

私は静的にリンクしていると思いますが、dynaをロードするために必要なシンボルはすべて保持していないと思いますマイク拡張モジュール(すなわち、 -Xlinker -export-dynamic)。 Linking Requirementsを参照してください。これは、正しいオプションをdistutils.sysconfig.get_config_var('LINKFORSHARED')から検索することを推奨しています。

ところで、可変性関数Py_BuildValueは、argsを作成するより便利な方法です。

関連する問題