如何从嵌入式Python程序访问实例值?

0 投票
2 回答
1072 浏览
提问于 2025-04-17 01:04

假设我有一个包含嵌入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()

撰写回答