2014-04-01 62 views
0

對不起,這裏有很多,但我真的認爲所有這些信息都與我要問的問題有關。我可以用Python創建我的C++對象,但不能訪問方法

因此,我用SWIG封裝了我的C++類,編譯了等,並在一個python腳本中創建了我的類的實例,然後嘗試調用該類的方法。通知我說「嘗試」打電話。該方法的調用失敗。下面是關於實施&「失敗」的細節。

首先,我建立了Python3.4解釋我的Windows應用程序,並調用我的Python腳本如下:

Py_Initialize(); 

/* Some code here to set up python paths. */ 
..... 

PyObject *pName = PyUnicode_FromString("hello"); 
if(pName == NULL) 
{ 
    Py_Finalize(); 
    return false; 
} 

PyObject* pModule = PyImport_Import(pName); 
if(pModule == NULL) 
{ 
    Py_Finalize(); 
    return false; 
} 

/* "go" is the name of the function in my python script that I want to call. */ 
PyObject *pFunc = PyObject_GetAttrString(pModule, "go"); 
if(pFunc == NULL) 
{ 
    Py_Finalize(); 
    return false; 
} 

PyObject *pArgs = PyTuple_New(0); 
PyObject *pValue = PyObject_CallObject(pFunc, pArgs); 
if(pValue == NULL) 
{ 
    Py_Finalize(); 
    return false; 
} 

Py_Finalize(); 
return true; 

================= ==

這裏是我的階級結構:

class BoganDocument 
{ 
private: 
    BoganMetadataSet myMetadata; 

public: 
    // Constructor 
    BoganDocument(); 

    // Destructor 
    virtual ~BoganDocument(); 

    // Useful methods. 
    wstring  getMetadataValue(wstring metadata_name); 
} 

===================

這裏是我的Python腳本(名爲「hello.py」)。

import BoganDocument 
def go(): 
    print("I'm in go()") 
    d = BoganDocument.BoganDocument() 
    print("I made a document") 
    ts = d.getMetadataValue("CreationTimestamp"); 
    print("The creation timestamp is " + ts) 

=====================

而且我的控制檯屏幕上的輸出看起來是這樣的:

trying C:\Program Files (x86)\MyApp\Python\swig_runtime_data4_d.pyd 
trying C:\Program Files (x86)\MyApp\Python\swig_runtime_data4.py 
trying C:\Program Files (x86)\MyApp\Python\swig_runtime_data4.pyw 
trying C:\Program Files (x86)\MyApp\Python\swig_runtime_data4.pyc 
trying c:\MyApp\Workplace\swig_runtime_data4_d.pyd 
trying c:\MyApp\Workplace\swig_runtime_data4.py 
trying c:\MyApp\Workplace\swig_runtime_data4.pyw 
trying c:\MyApp\Workplace\swig_runtime_data4.pyc 
import 'BoganDocument' # <_frozen_importlib.SourceFileLoader object at 0x10D2E3F0> 
import 'hello' # <_frozen_importlib.SourceFileLoader object at 0x10D2E1C0> 
I'm in go() 
I made a document 

===================

請注意,我已將PYTHONVERBOSE設置爲11以獲取儘可能多的診斷信息。並注意所有消息在「print(」我創建文檔「)」之後停止。沒有語法錯誤,沒有。 「PyObject * pValue = PyObject_CallObject(pFunc,pArgs);」之後的pValue的值一片空白。

現在,在「d = BoganDocument.BoganDocument()」構造函數的調用已知可以工作,因爲我在BoganDocument構造函數中設置了一個斷點並單步執行。

我還在BoganDocument的getMetadataValue方法中設置了斷點,但從未到達那裏。還有這個謎團。

毫無疑問,我有一個錯誤,但我沒有線索。

+0

Scholloii:這是達成交易的建議。謝謝!!我發現SWIG並沒有完全理解什麼是wstring。多了一點google搜索引導我添加了,然後在我的BoganDocument.i SWIG接口文件中定義了UNICODE 1。 – user3453991

+0

很好聽,接下來我要問的是檢查'.i'文件是否包含'std_wstring.i',但我不知道'UNICODE'。我已經將我的評論作爲答案,我希望你能接受。您可能希望將您的評論附加到答案上,並刪除上面的評論,但爲了清晰起見,不要緊。歡迎來到SO! – Schollii

回答

0

您是否踩入SWIG 包裝是否爲getMetadataValue?當您執行Python C++封裝器時,C++包裝器會在相應的C++實例上調用Bogan::getMetadataValue。既然你永遠不會去C++實例的getMetadataValue,也許SWIG包裝會發現這個調用是非法的或者這樣(SWIG通常不會默默地忽略問題,但我不知道還有什麼建議)。由於您使用的是寬字符串,因此請確保您包含std_wstring.i

相關問題