嵌入式Python
我正在尝试从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:
注意,这里使用的是PyUnicode_
,而不是PyString_/PyBytes_
。在很多地方,Python 2.x使用字节字符串,而Python 3.x使用的是Unicode字符串。
顺便说一下,我通常会用这个页面来查找所有可能的调用: