2014-10-03 4 views
0

내 C++ 프로그램과 sympy를 사용하려고하는데 다음과 같은 임베딩 코드를 사용하고 있습니다.C++ 임베딩을 사용하여 sympy 호출하기

int sym_ex(const char * input_expression, const char * output_expression){ 

    PyObject *pName, *pModule, *pDict, *pFunc; 
    PyObject *pArgs, *pValue; 
    int i; 

    const char * file = "sympy"; 
    const char * function = "simplify"; 


    Py_Initialize(); 
    //PyRun_SimpleString("from sympy import *\n"); 
    pName = PyString_FromString(file); 
    /* Error checking of pName left out */ 

    pModule = PyImport_Import(pName); 
    Py_DECREF(pName); 

    if (pModule != NULL) { 
     pFunc = PyObject_GetAttrString(pModule, function); 
     /* pFunc is a new reference */ 

     if (pFunc && PyCallable_Check(pFunc)) { 

      pArgs = PyTuple_New(1); 
      pValue = PyString_FromString(input_expression); 
      printf("the string passed %s\n", input_expression); 
      if (!pValue) { 
       Py_DECREF(pArgs); 
       Py_DECREF(pModule); 
       fprintf(stderr, "Cannot convert argument\n"); 
       return 1; 
      } 
      /* pValue reference stolen here: */ 
      PyTuple_SetItem(pArgs, 0, pValue); 

      pValue = PyObject_CallObject(pFunc, pArgs); 
      Py_DECREF(pArgs); 
      if (pValue != NULL) { 
       printf("Result of call: %s\n", PyString_AsString(pValue)); 
       Py_DECREF(pValue); 
      } 
      else { 
       Py_DECREF(pFunc); 
       Py_DECREF(pModule); 
       PyErr_Print(); 
       fprintf(stderr, "Call failed\n"); 
       return 1; 
      } 
     } 
     else { 
      if (PyErr_Occurred()) 
       PyErr_Print(); 
      fprintf(stderr, "Cannot find function \"%s\"\n", function); 
     } 
     Py_XDECREF(pFunc); 
     Py_DECREF(pModule); 
    } 
    else { 
     PyErr_Print(); 
     fprintf(stderr, "Failed to load \"%s\"\n", file); 
     return 1; 
    } 
    Py_Finalize(); 
    return 0; 

} 

하지만,이 기능을 사용하여 작은 프로그램을 작성하고 실행,

#include <stdio> 
#include <iostream> 

int main(){ 

char * input_expression = "2 + 2"; 
char * output_expression = new char[250]; 

sym_ex(input_expression, output_expression); 

return 0; 
} 

그것은 다음과 같은 유형의 오류를 제공합니다. Visual C++, Python 2.7.8에서 Windows에서 실행 중입니다.

Exception TypeError: 'expected string or Unicode object, Integer found' in <module 'threading' from 'C:\Python278\Lib\threading.pyc'> ignored 

누군가 나를 도울 수 있습니까? 감사합니다

+0

더 큰 목표는 무엇입니까? 왜 이렇게해야하는지 분명하지 않습니다. 속도인가요? 다음 CSymPy 원하는 수 있습니다 ... –

+0

CSymPy Visual C++ (Microsoft 컴파일러)에서 컴파일합니까? – Charith

+0

잘 모르겠습니다. 그들이 CMake를 사용하는 것처럼 보이기 때문에 기회가 상당히 좋다. https://github.com/sympy/csympy –

답변

0

여기서 문제는 정수가 아닌 문자열입니다 String_AsString(pValue)

printf("Result of call: %s\n", PyString_AsString(pValue)); 

sympy.simplify("2+2")의 결과는 4 호출입니다. 결과적으로 파이썬은 TypeError 예외를 발생시킵니다.

문자열을 결과로 사용하려면 먼저 PyObject_Str(pValue)을 호출 한 다음 C 문자열로 변환해야합니다.