代码之家  ›  专栏  ›  技术社区  ›  Begtostudy

从C++调用Python的问题

  •  1
  • Begtostudy  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  3
  •   Jason R. Coombs    15 年前

    上次我查过,C没有例外。当然,调用python lib不会引发任何异常。

    首先,由于您使用C++,您可能需要将Python LIB包含一个外部声明。

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

        2
  •  0
  •   Begtostudy    15 年前

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

    #XXX
    

    而且,它在蟒蛇身上也不起作用。 说错话了。

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