从c++函数中获取输出到python对象中

ctypes - get output from c++ function into python object

本文关键字:python 对象 输出 获取 c++ 函数      更新时间:2023-10-16

我遵循了这里给出的第二个答案中的示例代码-从python调用C/c++ ?

,并设法让它接受一个字符串参数。

这是我修改的cpp文件:

#include <iostream>
using namespace std;
class Foo{
    public:
        char* bar(char in[1000]){
            std::cout << "Hello" << std::endl;
            std::cout << in << std::endl;
            return in;
        }
};
extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    char* Foo_bar(Foo* foo, char in[1000]){ return foo->bar(in); }
}

然后我的python函数是这样的-

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()
    def bar(self, st):
        lib.Foo_bar(self.obj, st)
f = Foo()
a = f.bar('fd')

将"Hello"answers"fd"打印到屏幕上,但是当我查看a时,它是空的。如何修改这段代码,以便将结果输入到python对象a中?

编辑:基于我在这里指出的另一个问题,如何处理c++返回类型std::vector在Python的ctypes?

我试了如下:

from ctypes import *
lib.Foo_bar.restype = c_char_p
a=lib.Foo_bar('fff')

这给出了一个'x87x7f'

a = lib.Foo_bar('aaa')

这给出了一个'x87x7f'

所以,相同的,尽管参数不同。我遗漏了什么?

@Paul Mu Guire上面的建议可能有所帮助,但我需要的是一些非常简单的东西,即接受字符串并输出字符串。所以,整个面向对象的范例是多余的。我改成了一个简单的C结构-

extern "C" {
char* linked(char * in){ 
    return in;
  }
}

并且在执行lib.linked.restype = c_char_p.

之后效果很好