gpt4 book ai didi

python - 将变量从嵌入式 Python 传递到 C

转载 作者:行者123 更新时间:2023-11-30 17:22:39 24 4
gpt4 key购买 nike

有人可以向我解释一下如何将变量从嵌入式 Python 传递到我的 C 程序吗?我在网上到处查了一下,但我发现我不明白,因为我对 Python 知之甚少。

我尝试用 C 创建回调函数,但我不明白它是如何工作的。

现在,我的主程序是用 C 编写的。我在线程中创建一个 Python 对象,并从 Python 脚本调用 Python 函数。该函数生成值,我需要将这些值传回 C 程序以供进一步使用。

最佳答案

对于嵌入,我建议查看 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);

这是使用参数 pArgs 调用 python 函数(可调用 python 对象)pFunc,并返回 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,然后在每个线程中向文件描述符写入/读取。

关于python - 将变量从嵌入式 Python 传递到 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27945966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com