从 C++ "库"调用 Python 方法

calling python method from c++ "library"

本文关键字:Python 方法 调用 C++      更新时间:2023-10-16
通过嵌入python的代码编写

C++调用外部python类并执行该类的方法(FileHandler)。这行得通。我在 C++ (libSome.so) 中生成了一个该代码库,以便在 python 中使用 c_types 并制作一个包装器来尝试运行上述方法会导致分段错误。有什么想法吗?

(C++)这是然后作为共享库生成的嵌入式代码 (libSome.so):

...
    /* Funcion de python */
        setenv("PYTHONPATH", ".", 1);
        Py_Initialize();
        PyObject* module = PyImport_ImportModule("filehandler");
        assert(module != NULL);
        PyObject* class = PyObject_GetAttrString(module, "FileHandler");
        assert(class != NULL);
        PyObject* inst = PyInstance_New(class, NULL, NULL);
        assert(inst != NULL);
        result = PyObject_CallMethod(inst, (char*)"write", (char*)"(iiii)",ori,serv, id, timeStamp);
        assert(result != NULL);
        Py_Finalize();

(Python)库使用的代码

import os
class FileHandler:
     def __init__(self):
          self.workingDirectory = os.getcwd()
          pass
     def write(self, NodoOrigen, Servicio, Id, payload):
          try:
           os.mkdir(str(NodoOrigen))
          except:
           pass
      os.chdir(str(NodoOrigen)+"/")
      try:
           os.mkdir(str(Servicio))
      except:
           pass
      os.chdir(self.workingDirectory)
      os.chdir(str(NodoOrigen)+"/"+str(Servicio)+"/")
      try:
           f = open(str(Id),"a")        
      except:
           print "No se puede abrir el archivo"
      f.write(str(payload))
      f.close()
      os.chdir(self.workingDirectory)

我不确定这是否是您的问题,因为这里没有足够的信息,但 ctypes 仅用于调用 C 函数; 要调用C++函数,您需要将C++函数与extern "C"块中的函数包装在一起。

有关此示例,请参阅此答案:https://stackoverflow.com/a/145649/121714

我认为问题可能出在您使用PyInstance_New:https://mail.python.org/pipermail/python-list/2003-March/195516.html

也许试试这个:

PyObject* inst = PyObject_CallObject(class, NULL);

并使文件处理程序继承自 Python 代码中的对象。

类文件处理程序(对象):    ...

这是你的实际代码吗?如果它是C++,它不应该让你使用一个名为 class 的变量,assert(instance != NULL);应该读取assert(inst != NULL);

另外,哪条线实际上是导致段错误的原因?

另一种可能性:如果你从 Python 开始,然后调用调用 Python 的C++,C++代码不应该调用Py_Initialize();Py_Finalize();(但是,如果你有一个嵌入 Python 的C++应用程序,那就好了)