2011-05-13 34 views
4

我正在通過Python運行C++代碼,並希望pickle擴展類型。酸洗Python擴展類型定義爲具有PyObject *成員的C結構

因此,我有一個C++結構體(py_db_manager),它包含指向數據庫對象的指針和用python類型對象(t_db_manager)包裝的對象管理器對象(都用C++編寫)。我的問題是,這個python類型需要知道如何醃製這兩個指針,以便將它發送給一些子多核進程。所以我用copy_reg模塊註冊了這個類型(這相當於在該類型上編寫了一個reduce()方法,但是我不太確定該寫入什麼內容。 ?僅僅是整數指針?誰能幫助

typedef struct 
{ 
    PyObject_HEAD 
    PyObject* man_inst_ ; 
    PyObject* db_inst_ ; 

}py_db_manager;` 

這裏的Py_TypeObject

PyTypeObject t_db_manager = { 
    PyObject_HEAD_INIT(0)    /* tp_head */ 
    0,         /* tp_internal */ 
    ".py_db_manager",     /* tp_name */ 
    sizeof(py_db_manager)}; 

而這裏的代碼,將在減少方法:

PyObject *pickle_manager(PyObject *module, PyObject *args) 
{ 
    py_db_manager *cpp_manager =0; 
    PyObject *values = NULL, 
     *tuple = NULL; 
    char text[512]; 

    if (!PyArg_ParseTuple(args, "O!", &t_db_manager, &cpp_manager)) 
     goto error; 
    sprintf(text,"man_inst_, db_inst_"); 
    if ((values = Py_BuildValue("(sii)", text, 
           cpp_manager->man_inst_, cpp_manager->db_inst_)) == NULL) 
     goto error; 
    tuple = Py_BuildValue("(OO)", manager_constructor, values); 

error: 
    Py_XDECREF(values); 
    return tuple; 
} 

回答

0

因爲這將被傳遞到另一個進程,酸洗只是整數指針將不會像你想要的那樣工作。不同的進程使用不同的內存空間因此他們不會看到相同的東西。

因此,要回答你的問題,你應該醃製完整的對象,並從接收端重建它們。

+0

其實,這就是整個想法。我希望子進程查看SAME數據庫,並通過查看SAME指針來擁有相同的管理器。我打算通過使用sharedctypes模塊並調用shareddata = sharedctypes.Value(anInstanceof_t_db_manager)來完成此操作。但是,共享數據在發送給孩子時會被醃漬 – octi 2011-05-14 22:20:20

+0

但是,您不能只傳送指針!舉個例子,假設在父進程中,你的指針指向0x87654321。如果您將此指針傳遞給子進程,它仍會看到0x87654321,但在該地址處可能會有與父進程完全不同的內容。 – 2011-05-15 14:18:23

+0

因此,當python派生子進程時,它是否將父進程的內存表複製到每個子進程?這是我在調試時看到的情況:每個子進程都有一個在不同內存地址中找到的數據庫實例。你說的是,這些內存地址不是'全局',而是過程特定的?沒有辦法告訴子進程使用在父進程地址找到的數據庫嗎? – octi 2011-09-08 17:54:26