创建Python构造函数,参数来自c++, PyObject

Create Python Constructor with parameter from C++, PyObject

本文关键字:c++ PyObject 参数 Python 构造函数 创建      更新时间:2023-10-16

我有一个这样的python类A

class A: 
   def __init__(self, name): 
       self.name = name
   def print_lastname(self, lastname): 
       print(lastname)

我必须像这样调用这段代码。

import B
a = B.A("hello")
a.print_lastname("John")

目前,我需要使用这个A类从我的c++代码。我已经走到这里了。

Py_Initialize(); 
string hello = "hello"; 
PyObject *module, *attr, *arg; 
module = PyObject_ImportModule("B"); // import B
attr = PyObject_GetAttrString(module, "A"); // get A from B
arg = PyString_FromString(hello.c_str()); 
instance = PyInstance_New(attr, arg, NULL); // trying to get instance of A with parameter "hello"
Py_Finalize(); 

但是我得到错误

异常类型错误:'参数列表必须是元组'在模块'threading'从'/usr/lib64/python2.7/threading.pyc'

如何从c++实现从import语句到a.print_name("John")语句?

我将稍微重写一下Python类,以便它同时使用参数和成员变量。

# B.py - test module
class A:
    def __init__(self, name):
        self.name = name
    def print_message(self, message):
        print message + ' ' + self.name
至于c++部分,几乎一切看起来都很好。你得到的错误是因为PyInstance_New的参数应该是一个元组。调用函数或方法有多种方式。下面是使用其中一个的完整示例:
// test.c - test embedding.
void error_abort(void)
{
    PyErr_Print();
    exit(EXIT_FAILURE);
}
int main(int argc, char* argv[])
{
    PyObject* temp, * args, * attr, * instance;
    Py_Initialize();
    if (!(temp = PyString_FromString("John")))
        error_abort();
    if (!(args = PyTuple_Pack(1, temp)))
        error_abort();
    Py_DECREF(temp);
    if (!(temp = PyImport_ImportModule("B")))
        error_abort();
    if (!(attr = PyObject_GetAttrString(temp, "A")))
        error_abort();
    Py_DECREF(temp);
    if (!(instance = PyInstance_New(attr, args, NULL)))
        error_abort();
    if (!PyObject_CallMethod(instance, "print_message", "s", "Hello"))
        error_abort();
    Py_DECREF(args);
    Py_DECREF(attr);
    Py_DECREF(instance);
    Py_Finalize();
    return 0;
}

更多信息请参见Python纯嵌入。