有人可以向我解释如何将嵌入式Python中的变量传递给我的C程序吗? 我在网上到处都看,我发现我不明白,因为我对Python知之甚少。
我尝试在C中创建一个回调函数,但我不明白它应该如何工作。
现在,我的主要程序在C中。我在一个线程中创建一个Python对象,并从Python脚本调用Python函数。此函数生成值和这些值,我需要将这些值传递回C程序以供进一步使用。
答案 0 :(得分:0)
对于嵌入,我建议查看Python网站上的文档:https://docs.python.org/3.4/extending/embedding.html#pure-embedding
您感兴趣的部分是:
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, argv[2]);
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(argc - 3);
for (i = 0; i < argc - 3; ++i) {
pValue = PyLong_FromLong(atoi(argv[i + 3]));
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
fprintf(stderr, "Cannot convert argument\n");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL) {
printf("Result of call: %ld\n", PyLong_AsLong(pValue));
Py_DECREF(pValue);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
特别是这一行:
pValue = PyObject_CallObject(pFunc, pArgs);
这是调用python函数(可调用的python对象),pFunc,带参数pArgs,并返回一个python对象pValue。
我建议阅读整个页面以更好地理解嵌入python。另外,既然你说你对python知之甚少,我建议你更熟悉这种语言,以及它与c / c ++有多么不同。在嵌入它之前,您需要了解有关python如何工作的更多信息。
修改强> 如果你需要在你的c / c ++代码和python代码之间共享内存(在单独的线程中运行),我不相信你可以直接共享内存,至少不像你通常用c / c ++那样。但是,您可以创建一个内存映射文件,以获得与大致相同性能相同的效果。这样做将取决于平台,我没有这方面的经验,但这里有一个应该有用的链接:http://www.codeproject.com/Articles/11843/Embedding-Python-in-C-C-Part-II。
基本上,你只需在c中创建mmap(这是平台相关部分),然后在python代码中为同一个文件创建一个mmap,然后在每个线程中写入/读取文件描述符。 / p>