读取.ini文件

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));
   } 






你可能感兴趣的:(读取.ini文件)