我有C ++代码调用包含cythonized python函数的DLL。 python函数使用DataFrame(创建它,然后在其上执行查找/填充)。我想只创建一次DataFrame,这意味着我需要在python函数退出后保持其状态。
我还没有找到一种方法如何将数据帧指针从cython工厂返回到C ++,然后将其从C ++发送到其他cython函数。我想在cython中避免使用类似单身的解决方案。请指教。
EDIT1: foo.pyx:
cdef public string Foo( const string& csvpath ) except *:
cdef string c_csvpath = csvpath
#...
foo.h中:
__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &);
答案 0 :(得分:0)
我将假设您要保留string
返回类型(如果没有,那么您只需返回一个Python对象,您可能会发现它更容易)。如果是这种情况,那么您需要使用其中一个函数参数来存储数据。原则上可以使用任何可变的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签名变为:
__PYX_EXTERN_C DL_IMPORT(std::string) Foo(std::string const &, PyObject *);
在C ++代码中,您需要创建并保存字典:
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