在 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.og++ -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 停止和重新启动从 python 运行的 C++ 代码

使用 ctypes 在 python 中使用 C++ 库

使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?

WindowsError 异常访问冲突 - 在简单的 python c++ ctypes 接口中

如何使用 ctypes 将数组从 C++ 函数返回到 Python