c++,python
c++中怎样读取python文件中多个字典的key和value值,并且字典中的key值(一个key中有多个值)有数字类型和字符串类型的?
比如python中的cal.py文件代码如下:
def mix():
#key中有数字类型和字符串类型的
r={(1,'b','c'):'1aaaaa',
(2,'c','d'):'2bbbbb',
(3,'d','e'):'3ccccc'
}
n={(1,'b'):'1qqqqq',
(2,'c'):'2wwwww',
(3,'d'):'3eeeee'
}
return r,n
c++中代码如下:
Py_Initialize();
PyObject * pModule =NULL , *first = NULL, *pDict = NULL;
pModule = PyImport_ImportModule("cal");
first = PyObject_GetAttrString(pModule,"mix");
PyObject * pyValue = PyObject_CallFunction(first, NULL);
PyObject *key_dict = PyDict_Keys(pyValue); //return PyListObject
size_t len=PyDict_Size(pyValue);
for(size_t i=0;i<len;++i)
{
PyObject *key = PyList_GetItem(key_dict, i); // 返回元组
size_t lent3 = PyTuple_GET_SIZE(key);
for (size_t k=0;k<lent3;++k)
{
if(PyInt_Check(keylist3))
{
long key3 = PyInt_AsLong(keylist3);
cout<<key3<<endl;
}
if(PyString_Check(keylist3))
{
string key3 = PyString_AsString(keylist3);
cout<<key3<<endl;
}
}
PyObject *value = PyDict_GetItem( pyValue, key); //查询value
string cval = PyString_AsString(value); //转换结果
//string s = PyString_AsString(key);
cout<<cval<<endl;
}
Py_Finalize();
system("pause");
return 0 ;
这样判断key的类型为什么不对?还要怎样获得两个字典的key和value值????
Python C++
[解决办法]
判断类型并没有错, 只是你的遍历少了一层而出错:
Py_Initialize();
PyObject * pModule =NULL , *first = NULL, *pDict = NULL;
pModule = PyImport_ImportModule("cal");
first = PyObject_GetAttrString(pModule,"mix");
PyObject * pyValue = PyObject_CallFunction(first, NULL); // 如果 Python 的函数返回多个值, 则返回的类型其实是元组, 所以还需要多一层来遍历每一个返回值.
size_t retCount = PyTuple_GET_SIZE(pyValue);
for(size_t r = 0; r < retCount; ++r)
{
PyObject* pyDict = PyTuple_GetItem(pyValue, r); // 每一个返回值都是字典
PyObject *key_dict = PyDict_Keys(pyDict); //return PyListObject
size_t dictLen = PyDict_Size(pyDict);
for(size_t i = 0; i < dictLen; ++i) // 遍历字典的每一个元素
{
PyObject* key = PyList_GetItem(key_dict, i);
size_t lent3 = PyTuple_GET_SIZE(key);
for (size_t k = 0; k < lent3; ++k)
{
PyObject * keylist3 = PyTuple_GetItem(key, k);
if(PyInt_Check(keylist3))
{
long key3 = PyInt_AsLong(keylist3);
cout<<key3<<endl;
}
if(PyString_Check(keylist3))
{
string key3 = PyString_AsString(keylist3);
cout<<key3<<endl;
}
}
PyObject *value = PyDict_GetItem( pyDict, key); //查询value
string cval = PyString_AsString(value); //转换结果
cout<<cval<<endl;
}
}
Py_Finalize();