从 C++ "库"调用 Python 方法
calling python method from c++ "library"
通过嵌入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++应用程序,那就好了)
相关文章:
- 如何通过python方法和kwargs来提升python的c++函数和调用
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 无法将__str__特殊方法与Boost::Python接口
- 方法 argv[] SWIG C++ / Python 中的错误,会发生什么?
- 在C++和Python之间交换数据的最快方法是什么?
- Python的追加方法C++等价物是什么?
- 我如何在C++中使用某种方法来替换 python 中的 isdisjoint
- 如何使用Python脚本或其他一些方法来美化所有文件
- boost.python:如何获取super()方法
- 在 Python 中使用 C/C++ 的最快方法是什么?
- Python方法的OpenCV C 类似物
- 有没有一种方法可以从C++中调用"async"python方法
- 从Python方法中访问Python类中的C指针,Cython
- 使用引用参数增强 Python 方法调用
- 从 C++ 调用的 python 方法返回列表
- 从 C++ "库"调用 Python 方法
- 从c++(或C)回调调用python方法
- 将简单的python方法转换为c++