2017-03-21 15 views
0

cython化されたpython関数を含むDLLを呼び出すC++コードがあります。 Pythonの関数はDataFrameで動作します(作成してから検索します)。私はDataFrameの作成を1回だけ行いたいと思います。つまり、Python関数が終了してから状態を維持する必要があります。DataFrameの状態をcython呼び出しで保持する

私は、DataFrameポインタをcythonファクトリからC++に戻し、後でC++から他のcython関数に送る方法を見つけられませんでした。私はcythonでシングルトンのようなソリューションを避けたい。お知らせ下さい。

EDIT1: foo.pyx:

cdef public string Foo(const string& csvpath) except *: 
    cdef string c_csvpath = csvpath 
    #... 

がfoo.h:私はあなたがいない場合はすることができます(string戻り値の型を維持したいと仮定するつもりです

__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &); 
+0

dllをどのように呼び出すかを(簡略化したバージョン)表示できますか? isは[publicまたはapiのいずれか](https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#using-cython-declarations-from-c)を使用していますか?おそらく 'DataFrame'を保存するのはかなり簡単だと思いますが、あなたが今行っていることを推測するのは少し難しいでしょう。 – DavidW

+0

私は "public"コールをしています。 –

答えて

0

単にPythonオブジェクトを返すだけです)。この場合、関数の引数の1つを使用してデータを格納する必要があります。どれでも変更可能なPythonオブジェクトは、原則的に使用することができますが、私はそれが最も理にかなっていると思うので、私は辞書を証明するつもりです:

cdef public string Foo(const string& csvpath, dict saved_data) except *: 
    cdef string c_csvpath = csvpath 

    # get the DataFrame if possible, otherwise generate it 
    try: 
     df = saved_data['dataframe'] 
    except KeyError: 
     df = 3.3 # somehow generate your dataframe 


    # at the end make sure everything's updated 
    saved_data['dataframe'] = df 
    return csvpath 

Cの署名は次のようになります。あなたのC++コードで

__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &, PyObject *); 

辞書を作成して保存する必要があります。

PyObject* data = PyDict_New(); 
// good code would check for null here 

string out = Foo(string("Hi"),data); 

// your data dictionary should now have "dataframe" in it 

// a second call, reusing the data frame 
string out2 = Foo(string("Hi"),data); 

// once you're sure you've done with the data frame 
Py_DECREF(data); // frees it, unless Python also has a copy 
+0

非常に感謝しています。 –

関連する問題