如何从嵌入式Python程序访问实例值?
假设我有一个包含嵌入Python的C程序:
const char *pyCode =
"class Foo:\n"
" def __init__(self):\n"
" self.foo = 42\n"
" def set_foo(foo):\n"
" self.foo=foo\n"
"\n"
"foo=Foo()\n"
;
Py_Initialize();
PyObject* main_module = PyImport_AddModule("__main__");
PyObject* main_dict = PyModule_GetDict(main_module);
PyRun_StringFlags(pyCode, Py_file_input, main_dict, main_dict, NULL);
PyObject *FooObj = PyDict_GetItemString(main_dict, "foo");
现在,C语言中的变量 FooObj
是指向Python实例 foo
的引用。那么,我该如何从C语言中访问 FooObj
的属性呢?
特别是,我怎样才能访问PyObject 'foo.foo' 呢?
还有,我该如何从C语言调用成员函数 foo.set_foo() 呢?
2 个回答
1
使用 对象协议 的一些函数。PyObject_GetAttr
这一系列函数是用来访问对象的属性的,比如说 PyObject_GetAttrString(FooObj, "foo")
就是获取对象 FooObj 的 foo 属性。而 PyObject_Call
这一系列函数则是用来调用对象的方法,比如 PyObject_CallMethod(FooObj, "set_obj", "(O)", some_other_object)
就是调用 FooObj 的 set_obj 方法,并传入一个其他对象作为参数。
2
http://docs.python.org/c-api/ 是你学习的好帮手。
要读取属性,可以使用 PyObject_GetAttr()
或者 PyObject_GetAttrString()
,而调用方法则可以用 PyObject_CallMethod()
。