Проблемы вызова Python из C ++ - PullRequest
1 голос
/ 23 июня 2010

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 голосов
/ 23 июня 2010

В последний раз я проверял, C не имеет исключений. Конечно, вы не получите никаких исключений при вызове библиотеки Python.

Во-первых, поскольку вы используете C ++, вам может потребоваться включить библиотеку Python с объявлением extern.

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

Далее, поскольку у вас нет исключений в вызовах C, вы должны проверять результат каждого вызова по мере продвижения. Это поможет вам лучше понять, где это происходит.

Так как вы не получаете segfault или что-то еще, я подозреваю, что вы получаете

if(!Py_IsInitialized())
 return -1;

И выход. Вместо этого вы можете напечатать возвращаемое значение, чтобы знать, что происходит.

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

Если это не демонстрирует проблему, тогда добавьте дополнительные операторы cout в ваш код, чтобы отслеживать, где возникает проблема ... или, что еще лучше, используйте отладчик и пошагово просматривайте код во время его работы. Наверняка вы поймете, что происходит не так.

0 голосов
/ 25 июня 2010

Я обнаружил, что он содержит несколько китайских слов в первой строке.

#XXX

И он также не работал в pythonwin.Сказал что-то не так.

Итак, я их удалил, и все нормально!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...