【问题标题】:Return string from python to C++从python返回字符串到C++
【发布时间】:2020-12-12 20:22:01
【问题描述】:

我的 python 代码有返回字符串的方法。

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() 

如果调用 ReadDataTest() 方法,结果有字符串{"Message":"You Have Successfully Connected"}

由于这个python方法是从C++调用的,所以我需要用C++解析返回的String。

我试过了

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);
  }
}

但我在编译时出错。如何从 python 接收字符串到 C++?

【问题讨论】:

    标签: python c++ python-c-api


    【解决方案1】:

    PyObject_GetAttrString返回一个PyObject *,妥善处理,代码如下:

    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);
        }
    }
    

    如果gettext 是一个方法然后调用它,不要只是得到它:

    PyObject * res = PyObject_CallMethod(pValue, "gettext", NULL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2017-08-06
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多