从 C++“库”调用 python 方法
Posted
技术标签:
【中文标题】从 C++“库”调用 python 方法【英文标题】:calling python method from c++ "library" 【发布时间】:2013-10-07 19:54:14 【问题描述】:通过嵌入python的C++代码编写的代码调用外部python类并执行该类的方法(FileHandler)。这样可行。 我在 C++ (libSome.so) 中生成了该代码的库,以便在带有 c_types 的 python 中使用,并制作一个包装器来尝试运行上述方法会产生分段错误。有什么想法吗?
(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)
【问题讨论】:
严重缺乏代码和细节。 第 63 行左侧有一个错误。需要buf-1
而不是buf
为什么会出现代码行段错误?我也对 ctypes 的引用感到困惑。如果您想在 Python 中嵌入 C++ 代码,请使用扩展。使用 ctypes 加载此代码然后简单地回调到 Python 会很奇怪。甚至不确定这是否有效。
嗯..你有没有机会从python内部调用这个c++代码,例如,通过ctypes
库?
令人惊讶的是,您编辑了问题,但仍然拒绝告诉我们哪一行代码导致了段错误。你可能不知道。这意味着您需要备份并进行一些调试。
【参考方案1】:
我不确定这是否是您的问题,因为这里没有足够的信息,但 ctypes 仅用于调用 C 函数;要调用 C++ 函数,您需要使用 extern "C"
块中的函数包装 C++ 函数。
有关此示例,请参阅此答案:https://***.com/a/145649/121714
【讨论】:
python -> c++。 Works (wrapper) c++ -> python with shared library 不起作用。问题是当我想从库(c++)中调用生成的共享库中的python类方法时。抱歉,我的英语不太擅长正确解释问题。【参考方案2】:我认为问题可能在于您使用 PyInstance_New
: https://mail.python.org/pipermail/python-list/2003-March/195516.html
不妨试试这个:
PyObject* inst = PyObject_CallObject(class, NULL);并使 FileHandler 从 Python 代码中的对象继承。
类文件处理程序(对象): ...这是您的实际代码吗?如果是 C++,它不应该让你使用一个名为 class
的变量,assert(instance != NULL);
应该是 assert(inst != NULL);
另外,实际上是哪一行导致了段错误?
另一种可能性:如果您从 Python 开始,然后调用调用 Python 的 C++,则 C++ 代码不应调用 Py_Initialize();
或 Py_Finalize();
(但是,如果您有嵌入 Python 的 C++ 应用程序,那将是很好)
【讨论】:
以上是关于从 C++“库”调用 python 方法的主要内容,如果未能解决你的问题,请参考以下文章