我正在尝试启动并使用ctypes在Linux机器上从Python 2.7调用C++库。目前,我只是玩玩具的例子。我阅读并能够复制此线程中给出的示例:Calling C/C++ from python?。请注意,C++类函数没有输入。在Python和C++中使用ctypes时发生Seg错误
我想扩展这个例子如下。
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
行,我都遇到同样的问题。
我在做什么错?谢谢。
std :: string不是指向某个指针的typedef,而是一个类。我不是100%肯定的,但是我会尝试改变你的Foo采取一个字符指针,看看它是否不以这种方式分段错误。我不知道你会如何改变它以保持与std :: string的兼容性,但我确信这是一种方法。 – Wug
你正在从python调用f.Foo('somename')'中的'Foo'构造函数。你不是从你的Python代码中执行'f.bar'吗? –