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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.