【发布时间】:2018-07-02 19:58:18
【问题描述】:
我的 Python 脚本 app.py 有这个功能,例如:
def testmethod(x):
return {"steps":["hello","world"]}
我在 Objective-C 中使用 Python C-API 如下:
Py_Initialize();
PyObject *pName = PyUnicode_DecodeFSDefault("app");
PyObject* pModule = PyImport_Import(pName);
Py_DECREF(pName);
PyObject* myFunction = PyObject_GetAttrString(pModule,(char*)"testmethod");
PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(223.22));
PyObject* myResult = PyObject_CallObject(myFunction, args);
NSLog(@"Check for dict: %d",PyDict_Check(myResult)); // Prints true!!!!!!!!!!!! So definitely a dictionary
在此之后,我不确定如何转换 myResult 来检索我的字典。对于双精度和字符串,我们通常使用PyFloat_AsDouble 和PyUnicode_AsUTF8String、PyBytes_AsString 函数,但我似乎找不到PyBLAHBLAH_AsDict 或等效方法。
double result = PyFloat_AsDouble(myResult);
NSLog(@"Result: %f",result);*/
PyObject* pStrObj = PyUnicode_AsUTF8String(myResult);
char* zStr = PyBytes_AsString(pStrObj);
NSLog(@"String: %@",[NSString stringWithUTF8String:zStr]);
我对 Objective-C 没有太多经验,所以也许我没有找对地方。
如何将PyObject 转换为 NSDictionary?
我基本上是在寻找一种首先访问字典的 C 方法(例如地图),然后我可以使用 Objective-C 方法将其转换为 NSDictionary。与我使用 PyUnicode_AsUTF8String 的方式类似,PyBytes_AsString 和 stringWithUTF8String 都组合在一起以从 Python 字符串中获取 NSString。为字典寻找类似的东西。
我已经找到了实现这一目标的方法,但我不知道这是否是最好的方法。我修改了我的 python 脚本以使用 json.dumps 返回字典的字符串表示形式。然后在我的 Objective-C 代码中,我首先获取字符串,然后使用JSONObjectWithData 将 json 字符串转换为 NSDictionary。这暂时有效,但我很好奇是否有更好的方法来做到这一点,而不必从 Python 返回字符串而不是字典。这对我来说似乎更像是一种解决方法。这是我现在拥有的:
app.py:
import json
def testmethod(x):
return json.dumps({"steps":["hello","world"]})
目标-C:
Py_Initialize();
PyObject *pName = PyUnicode_DecodeFSDefault("app");
PyObject* pModule = PyImport_Import(pName);
Py_DECREF(pName);
PyObject* myFunction = PyObject_GetAttrString(pModule,(char*)"testmethod");
PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(223.22));
PyObject* myResult = PyObject_CallObject(myFunction, args);
PyObject* pStrObj = PyUnicode_AsUTF8String(myResult);
char* zStr = PyBytes_AsString(pStrObj);
NSString *jsonStr = [NSString stringWithUTF8String:zStr];
NSLog(@"String: %@",jsonStr);
NSError *error;
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"Dictionary: %@",dictionary);
【问题讨论】:
-
Objective-C 不是 C 或 C++。 Python C API 是 C API,而不是 Objective-C API;它没有将 Python 对象转换为 Objective-C 数据结构的函数。
-
@user2357112 是的,我明白这一点。我基本上是在寻找一种首先访问字典的 C 方法(例如地图),然后我可以使用目标 C 方法将其转换为 NSDictionary。与我使用
PyUnicode_AsUTF8String、PyBytes_AsString和stringWithUTF8String的方式类似,所有这些都组合在一起以从Python 字符串中获取一个NSString。为字典寻找类似的东西。 -
不是一个直接的答案,但你看过 PyObjC 吗? pythonhosted.org/pyobjc
标签: python ios objective-c cpython