嵌入python

Posted

技术标签:

【中文标题】嵌入python【英文标题】:embedding python 【发布时间】:2012-01-04 00:02:33 【问题描述】:

我试图从 C 代码中调用 python 函数,我遵循了来自 here 的示例

我也有正确的包含文件目录、库目录,并链接了 python32.lib(我使用 python 32)但是错误是 python/C API,如 PyString_FromString、PyInt_FromLong、PyInt_AsLong 未定义(调试器中的错误)

这很奇怪,因为我也在使用其他 API,但它们都很好......

这里有什么问题??

int
main(int argc, char *argv[])

    PyObject *pName, *pModule, *pDict, *pFunc;
    PyObject *pArgs, *pValue;
    int i;

    if (argc < 3) 
        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
        return 1;
    

    Py_Initialize();
    pName = PyString_FromString(argv[1]);
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) 
        pDict = PyModule_GetDict(pModule);
        /* pDict is a borrowed reference */

Py_Initialize()、PyImport_Import()、PyModule_GetDict() 都可以正常工作,但 PyString_FromString 不行...

【问题讨论】:

我真的认为函数 PyString_FromString 被重命名为 PyBytes_FromString 进入 Python 3.x。 【参考方案1】:

您使用的示例代码适用于古老的 Python 版本 2.3.2。 Python 3.x 行不仅在语言中而且在 C API 中引入了许多不兼容的地方。

您提到的函数在 Python 3.2 中不再存在。

PyString_ 函数已重命名为 PyBytes_

PyInt_ 函数消失了,应该改用PyLong_

这是您使用的相同示例,但用于 Python 3:

5.3. Pure Embedding

请注意,它使用的是PyUnicode_,而不是PyString_/PyBytes_。在 Python 2.x 使用字节字符串的许多地方,Python 3.x 使用 unicode 字符串。

顺便说一句,我通常使用这个页面来查找所有可能的调用:

Index – P

【讨论】:

所以我听从了你的建议,它奏效了。现在我想使用您提供的文档示例对其进行测试。我是否进入 .exe 目录和 cmd 'call multiply multiply 3 2' ?? 我想是的,是的,假设 exe 文件名为call。如果您遇到困难,请提出一个单独的问题。

以上是关于嵌入python的主要内容,如果未能解决你的问题,请参考以下文章

虚拟环境和嵌入 Python

在 MATLAB 中嵌入 Python

嵌入系统 [空闲 Python]

python源码编译(嵌入式)

在多线程 C 应用程序中嵌入 python

在 C++ 中嵌入 python