从C++调用Python时的问题

1 投票
2 回答
592 浏览
提问于 2025-04-16 00:19

test.py

def add(a,b):
 """  """
 print a,b,a+b
 return a+b

这是一个C语言程序

#include <python.h>
int _tmain(int argc, _TCHAR* argv[])
{
 try
 {
  PyObject *pName,*pModule,*pDict,*pFunc,*pArgs1,*pArgs2,*pOutput;

  Py_Initialize();
  if(!Py_IsInitialized())
   return -1;
  pModule=PyImport_ImportModule("test");

  pDict=PyModule_GetDict(pModule);

  pFunc=PyDict_GetItemString(pDict,"add");
  pArgs1=Py_BuildValue("ii", 1,2); 
  //pArgs2=Py_BuildValue("i", 2); 

  pOutput=PyEval_CallObject(pFunc,pArgs1);

  int c=0;
  PyArg_Parse(pOutput, "d", &c);
  cout<<c;

  //PyRun_SimpleString("");

  Py_Finalize();
 }
 catch(exception* ex)
 {
  cout<<ex->what();
 }
 char c;
 cin>>c;
 return 0;
}

控制台没有任何输出,然后就关闭了。

这是怎么回事呢?

谢谢!

2 个回答

3

我最后查了一下,C语言是没有异常处理的。所以,你在调用Python库的时候,肯定不会有异常抛出来。

首先,因为你在用C++,你可能需要用一个外部声明来引入Python库。

extern "C" {
    #include "python.h"
}

接下来,由于C语言的调用没有异常处理,你应该在每次调用后检查一下结果。这样可以帮助你更好地理解哪里出问题了。

既然你没有遇到段错误或者其他问题,我猜你可能是到了

if(!Py_IsInitialized())
 return -1;

然后就退出了。相反,你可以打印返回值,这样你就能知道发生了什么。

int is_init = Py_IsInitialized();
cout << "are we initialized? " << is_init;
if(!is_init)
    return -1;

如果这样还不能显示出问题,那就可以在代码中添加更多的cout语句,追踪问题出现的地方……或者更好的是,使用调试器,逐步运行代码。你肯定能找到出错的地方。

0

我发现第一行里有一些中文单词。

#XXX

而且,它在pythonwin里也不管用。说是出错了。

所以,我把它们删掉了,就没问题了!

撰写回答