嵌入Python

7
我正在尝试从C代码中调用Python函数,我遵循了这里的示例。我还有正确的包含文件目录、库目录,并链接了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(...) 不行。

2
我真的认为在Python 3.x中,函数PyString_FromString被重命名为PyBytes_FromString。 - Tarantula
1个回答

18

你所使用的例子代码是针对古老的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目录并输入命令“call multiply multiply 3 2”吗? - PeterG
我认为是的,假设exe文件被命名为“call”。如果你遇到困难,请提出单独的问题。 - yak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接