从C ++调用Python的问题

时间:2010-06-23 11:41:50

标签: c++ python api

test.py

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

c program

#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 个答案:

答案 0 :(得分:3)

最后我查了一下,C没有例外。当然,你不会因调用Python lib而抛出任何异常。

首先,由于您使用的是C ++,因此您可能需要在Python库中包含extern声明。

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语句以跟踪问题发生的位置......或者更好的是,使用调试器并在运行时逐步执行代码。当然你会发现出了什么问题。

答案 1 :(得分:0)

我发现它在第一行包含一些中文单词。

#XXX

而且,它在pythonwin中也不起作用。 说错了。

所以,我删除了它们,没关系!