2016-10-19 7 views
2

私はこのようなPythonクラスAを持っています。C++、PyObjectのパラメータを持つPythonコンストラクタを作成します。

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

しかし、私は、私はC++からimportの文からa.print_name("John")に達成することができますどのようにエラー

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

取得していますか? 何か助けていただければ幸いです。

答えて

5

Pythonクラスを少し書き直すつもりです。引数とメンバ変数の両方を使用するようにします。 C++の一部については

# B.py - test module 
class A: 
    def __init__(self, name): 
     self.name = name 

    def print_message(self, message): 
     print message + ' ' + self.name 

ほとんどすべてが大丈夫に見えます。あなたが得ているエラーは、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を参照してください。

+0

非常に素晴らしい!魅力のように動作します。 – pseudo

+0

素晴らしい - ありがとう! –

関連する問題