0

My python code has methods with returning String.

import urllib.request
import ssl
import suds.transport.http
from suds.client import Client

class UnverifiedHttpsTransport(suds.transport.http.HttpTransport):
  def __init__(self, *args, **kwargs):
     super(UnverifiedHttpsTransport, self).__init__(*args, **kwargs)
  def u2handlers(self):
     handlers = super(UnverifiedHttpsTransport, self).u2handlers()
     context = ssl.create_default_context()
     context.check_hostname = False
     context.verify_mode = ssl.CERT_NONE
     handlers.append(urllib.request.HTTPSHandler(context=context))
     return handlers

url="https://atictest.com/datamanagement.asmx?WSDL"
client = Client(url, transport=UnverifiedHttpsTransport())

def ReadDataTest():
  result = client.service.ReadTestData()
  return result

def ReadGridData():
  result = client.service.ReadGridData()  
  return result

def main():
  result=ReadGridData()
  print(result)

if __name__ == "__main__":
  main() 

If ReadDataTest() method is called result has string {"Message":"You Have Successfully Connected"}.

Since this python method is called from C++, I need to parse the String return in C++.

I tried as

pFunc_readtest = PyObject_GetAttrString(pModule, "ReadDataTest");
if (pFunc_readtest && PyCallable_Check(pFunc_readtest)) {
  pValue = PyObject_CallObject(pFunc_readtest, NULL);
  if(pValue != NULL) {
     std::string m_gettextFunction = PyObject_GetAttrString(pValue, "gettext");
     printf("Result of call: %c\n", m_gettextFunction);
     Py_DECREF(pValue);
  }
}

But I have error in compilation. How to receive String from python to C++?

1 Answer 1

2

The PyObject_GetAttrString returns a PyObject *, handle it properly, here is the code:

pFunc_readtest = PyObject_GetAttrString(pModule, "ReadDataTest");
if (pFunc_readtest && PyCallable_Check(pFunc_readtest)) {
    pValue = PyObject_CallObject(pFunc_readtest, NULL);
    if(pValue != NULL) {
        PyObject * res = PyObject_GetAttrString(pValue, "gettext");
        if (!PyUnicode_Check(res)) {
            // not a string, return error here
        }
        std::string m_gettextFunction = std::string(PyUnicode_AsUTF8(res));
        printf("Result of call: %c\n", m_gettextFunction);
        Py_DECREF(pValue);
    }
}

If gettext is a method then call it, don't just get it:

PyObject * res = PyObject_CallMethod(pValue, "gettext", NULL);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.