read_ini/config/login.cfg
[Account]
username=jason
password=123
read_ini/script/readcfg.py
#read .ini
import ConfigParser
def getUserName():
    config = ConfigParser.ConfigParser()
    config.readfp(open('../config/login.cfg'))
    userName = config.get("Account", "username")
    return userName
def getPassword():
    config = ConfigParser.ConfigParser()
    config.readfp(open('../config/login.cfg'))
    password = config.get("Account", "password")
    return password
#print getUserName()
read_ini/src/pytest.cpp
#include "Python.h"
int main(int argc, char** argv)
{
    Py_Initialize();
    if (!Py_IsInitialized())
    {
        return -1;
    }
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('../script/')");
    PyObject *pName, *pModule, *pDict, *pFunc, *pReturn;
    pName = PyString_FromString("readcfg");
    pModule = PyImport_Import(pName);
    if (!pModule)
    {
        printf("Not find readcfg.py\n");
        return -1;
    }
    pDict = PyModule_GetDict(pModule);
    if ( !pDict )
    {
        return -1;
    }
    // to call getUserName
    pFunc = PyDict_GetItemString(pDict, "getUserName");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        printf("Not find function [getUserName]\n");
        return -1;
    }
    pReturn = PyObject_CallObject(pFunc, NULL);
    char *pUserName = PyString_AsString(pReturn);
    if (!pUserName)
    {
        printf("Not get userName.\n");
        return -1;
    }
    printf("login:userName=%s\n", pUserName);
    // to call getPassword
    pFunc = PyDict_GetItemString(pDict, "getPassword");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        printf("Not find function [getPassword]\n");
        return -1;
    }
    pReturn = PyObject_CallObject(pFunc, NULL);
    char *pPassword = PyString_AsString(pReturn);
    if (!pPassword)
    {
        printf("Not get password.\n");
        return -1;
    }
    printf("login:password=%s\n", pPassword);
    Py_DECREF(pName);
    Py_DECREF(pReturn);
    Py_DECREF(pModule);
    Py_Finalize();
    return 0;
} 
遇到并解决的问题:
1,不要把脚本命名位test.py,test.py  是另外一个文件
import   test
print   test.__file__ 
2,如果PyImport_Import
脚本文件失败,可能是脚本内容本身有问题,应该首先确保python readcfg.py
执行没有问题。
待解决的问题:
1,
pReturn = PyObject_CallObject(pFunc, NULL);
int listSize = PyList_Size(pReturn);
char *pUserName = PyString_AsString(pReturn);
listSize为-1, 能够得到pUserName。
这样做,脚本函数只能返回一个值,与参考2不一样。
参考:
1,在调用python函数时两个API:
PyObject* PyObject_CallObject( PyObject *callable_object, PyObject *args)
已经获得了一个可以调用的python对象,比如一个函数,提供一个元组格式的参数调用,元组里面是按顺序的参数,apply(callable_object, args) 或者callable_object(*args)。
PyObject* PyObject_CallMethod( PyObject *o, char *method, char *format, ...)
调用一个对象里的一个函数,相当于python语法的o.method(args),其中的格式format可以参照文档里Py_BuildValue的参数。
2,脚本函数返回多个值:
 pArgs=PyTuple_New(1);
 PyObject *reVal;
 PyTuple_SetItem(pArgs,0,Py_BuildValue("s", "e:\\v"));
 
   //函数调用
    PyObject *pRetVal = PyEval_CallObject(pFunc, pArgs);
 long temp1;
 temp1=PyList_Size(pRetVal);
   //解析返回值
   for(int index=0;index<temp1;index++)
   {
    //vSValue.
    PyObject *tempPyObject=PyList_GetItem(pRetVal,index);
    int flag=PyString_Check(tempPyObject);
    vSValue.push_back(PyString_AsString(tempPyObject));
   }