Python ctypes 导致分段错误

2024-03-29 14:28:38 发布

您现在位置:Python中文网/ 问答频道 /正文

cType2是我用的著名图书馆。但我有分段错误。在

这是密码

在tryone.cpp公司在

#include <re2/re2.h>
#include <iostream>
#include <tuple>

using namespace re2;

RE2 re("([^ @]+)@([^ @]+)");

std::pair<string, string> match(string rawtext){
    string uname;
    string domain;
    RE2::PartialMatch(rawtext, re, &uname, &domain);
    return std::make_pair(uname, domain);
}

bool isit(string rawtext){
    return RE2::PartialMatch(rawtext, re);
}

extern "C" {
    bool there(string rawtext){ return isit(rawtext); }
}

int  main() {
    if(isit("zbcd@xyz.com")){
    printf("PASS\n");
    }
}

然后我用g++编译

^{pr2}$

这是我的python包装器函数

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

lib.there.argtypes = [c_char_p]
lib.there.restype = c_bool

print lib.there("abcd@xyz.com")

但是当我运行python代码时,它给了我分段错误python包装器.py在


Tags: restringreturnincludedomainlib错误bool
1条回答
网友
1楼 · 发布于 2024-03-29 14:28:38

第一步,从名称和您称之为“re2”库的部分(它非常有名,我不知道它;虽然它在Debian中,但似乎没有什么需要它)是一个正则表达式库。在Python的^{}模块中已经有了一个非常灵活的模块。在

其次,ctypes是本机库的不安全接口;您需要完全正确地获取所有内容,这意味着要了解底层类型系统,包括诸如何时可以分配或释放内存以及通过哪些例程分配或释放内存。它的正常用例是包装具有C接口的库,而不编写任何非Python代码。在这种情况下,内存分配应该很容易,因为您只返回一个bool而不保留字符串引用。在

但是,最重要的是,正如您所描述的,C++ std::string并不是^ {< CD3>}(实际上,C没有字符串数据类型!)在C++中,允许函数重载的基于类型的名称装订将使这一点变得明显,因为您将没有找到^ {< CD4> }函数,但是使用{{CD5}},您使用C的链接,该链接准确地取名称;^ {< CD2> }从包装器中获取其所有类型信息。您可以通过从char指针构造一个字符串来修复您的there()包装器(尽管您也应该传递长度,因为Python字符串可能包含nul),但是这个练习似乎是一种迂回的方法,使事情变得更难。在

考虑到您的方法同时需要一个C和一个Python包装器,并且没有编译器来对组合进行类型检查,那么使用swig这样的工具可能会更好。在

相关问题 更多 >