ctypes - 从c ++函数输出到python对象

时间:2016-07-03 08:38:44

标签: python c++ c ctypes

我已按照此处给出的第二个答案中的示例代码 - String.Split Method

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

这是我修改过的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')

这将打印到屏幕上&#34;您好&#34;和&#34; fd&#34;但是当我看到它时,它是空的。如何修改此代码以便将结果输入到python对象中??

编辑:基于我在这里指出的另一个问题,Calling C/C++ from python?

我尝试了以下内容:

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

这给出了一个&#39; \ x87 \ x7f&#39;

a = lib.Foo_bar('aaa')

这给出了一个&#39; \ x87 \ x7f&#39;

所以,尽管争论不同,但同样如此。我在这里错过了什么?

1 个答案:

答案 0 :(得分:1)

上面的@Paul Mu Guire的建议可能有所帮助,但我需要的是一个非常简单的东西,它取一个字符串并输出一个字符串。因此,整个面向对象的范式都是过度的。我改为简单的C结构 -

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

在执行lib.linked.restype = c_char_p后,它运行良好。