嵌入式Python

7 投票
1 回答
7574 浏览
提问于 2025-04-17 06:51

我正在尝试从C代码中调用Python函数,并且我参考了这里的一个示例。

我也设置了正确的包含文件目录和库目录,并且链接了python32.lib(我使用的是Python 32),但是出现了错误,提示像PyString_FromString、PyInt_FromLong、PyInt_AsLong这样的Python/C API未定义(调试时出现错误)。

这很奇怪,因为我还在使用其他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却不行……

1 个回答

18

你用的示例代码是很老的Python版本,2.3.2。Python 3.x引入了很多不兼容的地方,不仅在语言上,还有C API方面。

你提到的那些函数在Python 3.2中根本不存在了。

PyString_函数被改名为PyBytes_

PyInt_函数已经不再使用,应该用PyLong_

这是你用过的相同示例,但适用于Python 3:

5.3. 纯嵌入

注意,这里使用的是PyUnicode_,而不是PyString_/PyBytes_。在很多地方,Python 2.x使用字节字符串,而Python 3.x使用的是Unicode字符串。

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

索引 – P

撰写回答