将python嵌入C ++

问题描述

我对自己的实现有些困惑。我有一个要嵌入到C ++中的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://xxxxxest.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()

然后sample_main.cppplugin lib sample_plugin.cpp。

sample_plugin.cpp具有如下的python嵌入式代码

  Py_Initialize();
  pName = PyUnicode_DecodeFSDefault("web_interface");
  pModule = PyImport_Import(pName);
  Py_DECREF(pName);
  if (pModule != NULL) {
    pFunc_readtest = PyObject_GetAttrString(pModule,"ReadDataTest");
    if (pFunc_readtest && PyCallable_Check(pFunc_readtest)) {
      pValue = PyObject_CallObject(pFunc_readtest,NULL);
      if(pValue != NULL) {
         printf("Result of call: %s\n",pValue);
         Py_DECREF(pValue);
      }
    }
    Py_XDECREF(pFunc_readtest);
    Py_DECREF(pModule);
  }else{
    PyErr_Print();
    printf("Can't call python \n");
  }
  Py_FinalizeEx();

当我运行sample_main.exe时,出现错误

Traceback (most recent call last):
  File "/opt/nvidia/deepstream/deepstream-5.0/sources/apps/sample_apps/deepstream-test3/web_interface.py",line 2,in <module>
    import ssl
  File "/usr/lib/python3.6/ssl.py",line 101,in <module>
    import _ssl             # if we can't import it,let the error propagate
ImportError: /usr/lib/python3.6/lib-dynload/_ssl.cpython-36m-aarch64-linux-gnu.so: undefined symbol: PyExc_OSError
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py",line 63,in apport_excepthook
    from apport.fileutils import likely_packaged,get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py",line 5,in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py",line 30,in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py",line 23,in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py",line 24,in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py",in <module>
    import apt_pkg
ImportError: /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-aarch64-linux-gnu.so: undefined symbol: PyExc_ValueError

Original exception was:
Traceback (most recent call last):
  File "/opt/nvidia/deepstream/deepstream-5.0/sources/apps/sample_apps/deepstream-test3/web_interface.py",let the error propagate
ImportError: /usr/lib/python3.6/lib-dynload/_ssl.cpython-36m-aarch64-linux-gnu.so: undefined symbol: PyExc_OSError

当我包含Py_Initialize()时,错误将被消除;在sample_main.cpp内。

有人可以解释为什么需要包含Py_Initialize();吗?在sample_main.cpp里面?

这是正确的方法吗?我需要在里面什么东西

sample_main.cpp

是因为内存泄漏或其他任何问题?

解决方法

在嵌入Python的应用程序中,必须先调用Py_Initialize()函数,然后再使用其他Python / C API函数

文档的第一词https://docs.python.org/3/c-api/init.html