将变量从嵌入式Python传递给C

时间:2015-01-14 15:03:35

标签: python c variables

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

我尝试在C中创建一个回调函数,但我不明白它应该如何工作。

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

1 个答案:

答案 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>