2013-06-11 52 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中没有意义。 –