在 Python 和 C++ 中使用 ctypes 时出现 Seg 错误
Posted
技术标签:
【中文标题】在 Python 和 C++ 中使用 ctypes 时出现 Seg 错误【英文标题】:Seg fault when using ctypes with Python and C++ 【发布时间】:2012-08-27 13:18:28 【问题描述】:我正在尝试在 Linux 机器上使用 ctypes 从 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
行,我都有同样的问题。
我做错了什么?谢谢。
【问题讨论】:
std::string 不是指针的 typedef,它是一个类。我不是 100% 确定,但我会尝试更改您的 Foo 以获取字符指针,看看它是否不会以这种方式进行分段错误。我不确定您将如何更改它以保持与 std::string 的兼容性,但我确定有办法。 你正在从 python 调用f.Foo('somename')
中的 Foo
构造函数。你不应该从你的 python 代码中调用 f.bar
吗?
【参考方案1】:
在您的extern "C"
中,您声明Foo_new
接受std::string
参数,但是要从Python 调用代码,您必须使其成为真正的C 函数,其中包括接收字符串和字符指针。特别是当您实际上告诉解释器将您的字符串转换为字符指针时(这就是 c_char_p
调用所做的)。
【讨论】:
谢谢,我似乎已经修好了。在我的extern "C"
中,我现在拥有Foo* Foo_new(char* name) return new Foo(name);
,其他一切都相同。这行得通。以上是关于在 Python 和 C++ 中使用 ctypes 时出现 Seg 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ctypes 停止和重新启动从 python 运行的 C++ 代码
使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?