热门话题

Php 研究室

请教牛牛们一个C++内嵌python的问题,谢谢    作者:rolyluo发表于2009-06-16 15:57:48

	   

本人对python外行,但有任务得内嵌python并调用它的一些函数
请牛牛们帮我看下下面这两段代码,

本来的打算是:从一个文件读入数据,然后用这些数据初始化一个对象,但这里通过python,使得执行过程变成用callFunc执行函数来生成对象了,使得我不知从哪里怎样读数据

我想请问的是:
1, 第一段中的模块module_ 与第二段中的callFunc函数的关系是什么?
2, 第一段中importResult 是执行了打开文件的返回,这与模块module_有什么关系?
3, callFunc里面的函数与importResult 执行的那个文件又有什么关系?

Configuration::Configuration(std::string filename, int argc, const char* argv[]) {
Py_Initialize();
module_ = PyImport_AddModule("__main__");
dict_ = PyModule_GetDict(module_);
// Run program parameters before the configuration file, in case any values are
// needed for its initialization
runArgs(argc, argv);
int importResult = PyRun_SimpleString((std::string("from ") + filename + " import *").c_str());
if (importResult == -1) {
PyErr_Print();
throwError("Error opening config file '" + filename + "'");
}
//PyObject *confMod = PyImport_ImportModuleLevel("configSW", dict_, dict_, 0, -1);
//if (confMod == 0) {
// PyErr_Print();
// throwError("Error opening config file '" + filename + "'");
//}
// Run parameters again in case any of them were overwritten in the config file
runArgs(argc, argv);
}
/////////////////////////////////////////////
template
blitz::TinyVector Configuration::callFunc(std::string funcName, blitz::TinyVector point) {
// If the point contains NaN, then return the zero vector
if (isNaN(point(0)) || isNaN(point(1))) {
return static_cast(0);
}
PyObject *func = PyDict_GetItemString(dict_, funcName.c_str());
if (func == 0 || !PyCallable_Check(func)) {
throwError(std::string("Error: Function '") + funcName + "' not found in configuration file");
}
PyObject *ret = PyObject_CallFunction(func, "dd", point(0), point(1));
if(ret == 0) {
PyErr_Print();
throwError(std::string("Error calling function '") + funcName + "'");
}
blitz::TinyVector ans;
if (PyTuple_Check(ret)) {
if (PyTuple_Size(ret) < N) {
throwError("Too few values returned from '" + funcName + "'");
}
for (int i = 0; i < N; ++i) {
ans(i) = convert(PyTuple_GetItem(ret, i));
}
}
else {
if (N > 1) {
throwError("Too few values returned from '" + funcName + "'");
}
ans(0) = convert(ret);
}
Py_XDECREF(ret);
return ans;
}
////////////////////////////////////////////////
// Declare template specializations of the above function
template blitz::TinyVector Configuration::callFunc(std::string funcName, blitz::TinyVector point);
template blitz::TinyVector Configuration::callFunc(std::string funcName, blitz::TinyVector point);
template blitz::TinyVector Configuration::callFunc(std::string funcName, blitz::TinyVector point);

回复主题
Copyright © 2008-2010 版权所属:中国Python联盟 www.okpython.com
京ICP备08012290号 村长QQ:81356625 E-mail:xieaotian@163.com