2017-05-18 11 views
2

処理のためにPythonスクリプトに送る必要があるC++マップがあります。私はそれをPyDictに入れて送信するべきだと考えました。問題の私のスクリプトは、出力がPyDictオブジェクトをC++からPythonに送る方法

seting item succeeded 
From python script 
☺ 

そうではなく、印刷され、正しく

私のC++

#include <Python.h> 
#include <string> 

int main(int argc, char *argv[]) { 
    Py_Initialize(); 

    PyObject *import, *attr, *instance, *methodcall, *arg, *tuple; 
    PySys_SetPath("./py/"); 
    import = PyImport_ImportModule("class_test"); 
    attr = PyObject_GetAttrString(import, "TestMap"); 
    arg = PyString_FromString("arg from first"); 
    tuple = PyTuple_Pack(1, arg); 
    instance = PyInstance_New(attr, tuple, NULL); 

    PyObject *d = PyDict_New(); 
    PyDict_SetItemString(d, "k", PyInt_FromLong(3000)) ? printf("seting item failed\n") : printf("seting item succeeded\n"); 

    methodcall = PyObject_CallMethod(instance, "hello", "s", d); 

    Py_DECREF(instance); 
    Py_Finalize(); 
    return 0; 
} 

と私のシンプルなスクリプト

class TestMap(CLBase): 
    def __init__(self, c): 
    self.c = c 
    pass 
    def hello(self, s): 
    print "From python script" 
    print s 

それを受信しないこと辞書のようなものスマイリーの顔をプリントする

私は他のライブラリを使用すると、引数がchar*ですが、それはだということを言っている"s"

答えて

2
methodcall = PyObject_CallMethod(instance, "hello", "s", d); 

(はPython.hを使用して)、デフォルトのPythonのAPIを使用して答えを本当にないいただければ幸いです実際には辞書(PyObject*)です。 "O"を使用した場合、正しく解釈されるのはPyObject*です。フォーマット文字列PyObject_CallMethodPy_BuildValueと解釈され、hereと記載されています。

スマイリーフェイスは、文字列としての辞書の記憶にあるものをそのまま再解釈したものです。あなたがPythonのAPI関数の戻り値をチェックする必要があること以外


NULL通常はエラーを示す)と、あなたがメモリリークしているので、あなたがdecrefことはありませんいくつかPyObjectのがあるように見えます。

関連する問題