對不起,這裏有很多,但我真的認爲所有這些信息都與我要問的問題有關。我可以用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方法中設置了斷點,但從未到達那裏。還有這個謎團。
毫無疑問,我有一個錯誤,但我沒有線索。
Scholloii:這是達成交易的建議。謝謝!!我發現SWIG並沒有完全理解什麼是wstring。多了一點google搜索引導我添加了,和,然後在我的BoganDocument.i SWIG接口文件中定義了UNICODE 1。 –
user3453991
很好聽,接下來我要問的是檢查'.i'文件是否包含'std_wstring.i',但我不知道'UNICODE'。我已經將我的評論作爲答案,我希望你能接受。您可能希望將您的評論附加到答案上,並刪除上面的評論,但爲了清晰起見,不要緊。歡迎來到SO! – Schollii