2

私はこのような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")

現在、AC++ コードからこのクラスを使用する必要があります。私はここまで来ました。

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

しかし、私はエラーが発生しています

例外 TypeError: '/usr/lib64/python2.7/threading.pyc' からのモジュール 'threading' の 'argument list must be tuple'

importfromステートメントからa.print_name("John")from C++への変換方法を教えてください。どんな助けでも大歓迎です。

4

1 に答える 1

6

引数とメンバー変数の両方を使用するように、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タプルでなければならないためです。関数またはメソッドを呼び出す方法は複数あります。それらの 1 つを使用した完全な例を次に示します。

// 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を参照してください。

于 2016-10-20T01:59:28.350 に答える