2013-06-11 2 views
3

Je rencontre des problèmes pour essayer d'appeler une fonction Python à partir de mon code C++.Python C API - Création de mots-clés

Je suis en train d'appeler la fonction Django call_command, avec les paramètres suivants:

call_command('test', stdout=content) 

Voir here pourquoi. Cette exécute la commande sans stdout = argument contenu:

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

Je ne peux pas, pour la vie de moi, de savoir comment créer ce mot-clé. Nets-moi une chaîne 'stdout' = 'content', au lieu de stdout = content.

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

Fait la même chose.

Je peux obtenir le contenu PyObject sans problème si nécessaire, je n'arrive pas à créer correctement l'argument mot-clé stdout sans Python mettant des citations (le manipulant comme une chaîne) à un moment donné. Comment puis-je appeler call_command ('test', stdout = content) à partir de l'API C.?

+0

Voir si cela vous aide: http://stackoverflow.com/questions/145270/calling-c-c-from-python – karthikr

+0

Ne semble pas être ce que je veux. J'ai juste besoin de savoir comment créer ce mot-clé stdout et le passer comme argument d'appel de fonction en C. Je ne veux pas utiliser d'outils externes tels que SWIG ou Boost: Python. –

Répondre

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

PyObject_Call(executeFunc, args, kwargs); 

Notez que même en Python, vous pouvez appeler la fonction de la même façon:

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

call_command(*args,**kwargs) 

"stdout" est une chaîne avec des guillemets ici aussi, mais cela fonctionne. Vous essayez d'obtenir la même syntaxe que celle que vous utilisez en Python, avec noquotename = noquotevalue, mais la syntaxe est juste une représentation. Les deux {"quotedname": noquotevalue} et noquotename = noquotevalue sont deux façons différentes de représenter la même chose. Ils représentent tous deux un dictionnaire dont la clé est une chaîne et la valeur est un objet. C'est ce que vous passez comme le troisième argument de PyObject_Call.

1

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

+1

Et vous avez besoin de 'PyObject_Call()' pour transmettre ce dictionnaire en mots-clés. –

+0

'PyObject * kw = Py_BuildValue ("{s: O}", "stdout", PyObject_GetAttrString (PyImport_AddModule ("__ main__"), "contenu"));' ' rendements {stdout: } ' J'ai besoin de' stdout = content'. Pas d'accolades, pas de deux points au lieu de =, ni de guillemets sur stdout. Est-ce que je n'ai pas bien compris votre réponse? –

+0

En Python, un appel comme 'foo (3, x = 5)' est en fait le même que 'foo (* a, ** k)' avec 'a = (3,), k = {'x': 5 } '. La fonction 'PyObject_Call (f, a, k)' peut être utilisée en C et a la même signification que, en Python, l'expression 'f (* a, ** k)'. Il n'y a pas de C direct équivalent à "un mot-clé stdout = content", parce que cette syntaxe n'a pas de sens dans C. –