【问题标题】:Create Python Constructor with parameter from C++, PyObject使用来自 C++、PyObject 的参数创建 Python 构造函数
【发布时间】:2016-10-19 22:13:38
【问题描述】:

我有一个这样的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")

目前,我需要在我的 C++ 代码中使用这个 A 类。我已经走到这一步了。

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(); 

但是我遇到了错误

Exception TypeError: 'argument list must be tuple' in module 'threading' from '/usr/lib64/python2.7/threading.pyc'

如何从 C++ 实现从 import 语句到 a.print_name("John")? 任何帮助表示赞赏。

【问题讨论】:

    标签: python c++ tuples python-embedding pyobject


    【解决方案1】:

    我将稍微重写 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 pure-embedding

    【讨论】:

    • 非常棒!像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多