2013-06-11 88 views
3

我遇到了麻煩,試圖從我的C++代碼調用Python函數。Python C API - 創建關鍵字

我試圖調用Django的功能call_command,具有下列參數:

call_command('test', stdout=content) 

here原因。這運行沒有標準輸出=內容參數的命令:

PyObject_CallFunctionObjArgs(executeFunc, PyString_FromString("test"), NULL) 

我不能,爲我的生活,找出如何創建此關鍵字。

PyDict_New(); 
    PyDict_SetItemString(...); 

使我得到一個'stdout'='content'字符串,而不是stdout = content。

Py_BuildValue("{s=s}", ... , ...) 

做同樣的事情。

我可以得到的內容PyObject沒有問題,如果有必要,我似乎無法正確創建stdout關鍵字參數沒有Python把引號(處理它作爲一個字符串)在某一點。

如何從C API調用call_command('test',stdout = content)?

+0

看看這可以幫助你:http://stackoverflow.com/questions/145270/calling-c-c-from-python – karthikr

+0

似乎並不是我想要的。 我只需要找出如何創建這個stdout關鍵字,並將它作爲函數調用參數在C中傳遞。我不想使用外部工具,如SWIG或Boost:Python。 –

回答

2
PyObject *args = Py_BuildValue("(s)", "test"); 
PyObject *kwargs = PyBuildValue("{s:O}", "stdout", content); 

PyObject_Call(executeFunc, args, kwargs); 

注意,即使在Python中,你可以調用函數以同樣的方式:

args = ("test",) 
kwargs = {"stdout" : content} 

call_command(*args,**kwargs) 

「標準輸出」 這裏採用的是引號的字符串太多,但它的工作原理。您試圖獲得與您在Python中使用的語法相同的語法,noquotename = noquotevalue,但語法只是一種表示形式。 {「quotedname」:noquotevalue}和noquotename = noquotevalue是表示同一事物的兩種不同方式。它們實際上都代表一個字典,其鍵是一個字符串,值是一個對象。這就是您作爲PyObject_Call的第三個參數傳遞的內容。

1

Py_BuildValue("{s:O}", "stdout", content_obj)

+1

而你需要'PyObject_Call()'來傳遞這個字典作爲關鍵字。 –

+0

'PyObject * kw = Py_BuildValue(「{s:O}」,「stdout」,PyObject_GetAttrString(PyImport_AddModule(「__ main__」),「content」));' '{stdout:}' 我需要'stdout = content'。沒有讚譽,沒有冒號而不是=,並且在標準輸出上沒有引號。 我沒有正確理解你的答案嗎? –

+0

在Python中,像'foo(3,x = 5)'這樣的調用實際上和'foo(* a,** k)'相同,其中'a =(3,),k = {'x':5 }'。 'PyObject_Call(f,a,k)'函數可以在C中使用,其含義與Python中的表達式'f(* a,** k)'相同。沒有直接的C等價於「關鍵字stdout = content」,因爲這個語法在C中沒有意義。 –