高手帮忙看看python在.Net中为什么出错呀!!!!!
Py_Initialize(); //初始化 python interpreter
PyObject *pName = PyString_FromString( "test "); // python脚本文件名
PyObject *pModule = PyImport_Import(pName); // import 脚本,返回pModule
// pModule指向这个脚本对象
if ( !pModule )
{
cout < < "Can 't find the file! " < <endl;
return 0;
}
cout < < "Get the function in .py " < <endl;
PyObject *pDict = PyModule_GetDict(pModule); // 通过pModule得到dictionary的指针pDict
PyObject *pFunc = PyDict_GetItemString(pDict, "Add "); // 通过pDict得到你所需的function,此处 "Add "为test1.py
PyObject *pParam = PyTuple_New(1); // 填写function所需要的参数的一个funciton object
PyObject *pCurParam = PyInt_FromLong(10);
PyTuple_SET_ITEM(pParam,0,pCurParam);
PyObject *pAdded = PyObject_CallObject(pFunc,pParam);// 调用此function,并得到返回值
int max = PyInt_AsLong(pAdded); // 将返回值转换为c++的数据类型
cout < < "after added ,the number is " < <max < <endl;
Py_XDECREF(pAdded); // 引用计数减一
Py_XDECREF(pCurParam);
Py_XDECREF(pParam);
// Py_XDECREF(pFunc);
// Py_XDECREF(pDict);
Py_XDECREF(pModule);
//Py_XDECREF(pName);
Py_Finalize(); // 关闭 python interpreter
脚本为:
#E:\test.py
def Add(a):
b=a+4
return b
为什么我运行的时候总是崩溃呢?
就是在PyObject *pFunc = PyDict_GetItemString(pDict, "Add "); 中pFunc的返回值为空.
请高手帮帮忙呀,我想了一天都没有找到原因...
谢谢了......
急急!!!!
[解决办法]
你那个错误就是说你的那个函数指针*pFunc没指向任何东西。偶不知道PyDict_GetItemString(pDict, "Add ")具体是怎么实现的,不过偶觉得你的参数有问题,把Add改一改试一试。偶平时写C#和ruby,很少写python,也没在.net下用过python,所以也不能保证能解决...
[解决办法]
不要把 脚本命名位test.py , test.py 是另外一个文件
import test
print test.__file__
另外可能需要把环境变量 PYTHONPATH加上脚本文件的路径
[解决办法]
PyObject *pParam = PyTuple_New(0);
PyObject *pAdded = PyObject_CallObject(pFunc, pParam);
看看
------解决方案--------------------
我这段是能通过的,
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pFunc = PyDict_GetItemString(pDict, "PrintHello");
PyObject* pNone = PyObject_CallObject(pFunc, NULL);
其中,
def PrintHello():
print "Hello world";