使用Python和C ++的ctypes时出现段错误

时间:2012-08-27 13:18:29

标签: c++ python ctypes

我正在尝试使用ctypes在Linux机器上从Python 2.7调用C ++库。目前,我只是在尝试玩具示例。我阅读并能够复制此线程中给出的示例:Calling C/C++ from python?。请注意,C ++类函数不需要输入。

我正在尝试将此示例扩展如下。

Foo.cpp中

#include <iostream>
#include <string>
using namespace std;

class Foo {
public:
  Foo(string name);
  void bar(void);
private:
  string myName;
};
Foo::Foo(string name) {
  std::cout << "Entered constructor in C++" << std::endl;
  myName = name;
}
void Foo::bar(void) {
  std::cout << "Hello, this is " << myName << std::endl;
}

extern "C" {
  Foo* Foo_new(string name) {return new Foo(name);}
  void Foo_bar(Foo* foo) {foo->bar();}
}

代码使用g++ -c -fPIC foo.cpp -o foo.o然后g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o干净地编译。

然后我使用以下包装器

fooWrapper.py

from ctypes import cdll, c_char_p
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self,name):
        self.name = name
        self.obj = lib.Foo_new(c_char_p(name))
    def bar(self):
        lib.Foo_bar(self.obj)

因为我将一个字符串传递给构造函数,所以我觉得我需要使用c_char_p来强制转换它。也许这是错的。

当我在Python 2.7中执行代码时,我遇到了分段错误,

Python 2.7.2 (default, Feb 27 2012, 18:28:19) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fooWrapper as f
>>> foo = f.Foo('somename')
Segmentation fault

所以我从来没有进入C ++构造函数。无论我是否在Python代码中的构造函数方法中包含self.name = name行,我都会遇到同样的问题。

我做错了什么?感谢。

1 个答案:

答案 0 :(得分:0)

在你的extern "C"中声明Foo_new采用std::string参数,但是要使代码可以从Python调用,你必须使它成为一个真正的C函数,其中包括接收字符串一个字符指针。特别是当你实际上告诉解释器将你的字符串转换为字符指针时(这就是c_char_p调用的作用)。