标签: boost-python

为使用OpenCV的C++代码编写Python绑定

我正在尝试为一些使用OpenCV的C++代码编写一个python包装器,但是我很难将结果(一个OpenCV C++ Mat对象)返回给python解释器.

我查看了OpenCV的源代码,发现文件cv2.cpp具有转换函数,可以在PyObject*和OpenCV的Mat之间来回执行转换.我使用了那些转换函数,但在我尝试使用它们时遇到了分段错误.

我基本上需要一些关于如何使用OpenCV来连接python和C++代码的建议/示例代码/在线参考,特别是能够将OpenCV的C++ Mat返回给python解释器,或者可能建议如何/从何处开始调查原因分段错误.

目前我正在使用Boost Python来包装代码.

在此先感谢任何回复.

相关代码:

// This is the function that is giving the segmentation fault.
PyObject* ABC::doSomething(PyObject* image)
{
    Mat m;
    pyopencv_to(image, m);  // This line gives segmentation fault.

    // Some code to create cppObj from CPP library that uses OpenCV
    cv::Mat processedImage = cppObj->align(m);

    return pyopencv_from(processedImage);
}
Run Code Online (Sandbox Code Playgroud)

从OpenCV的源代码转换函数如下.转换代码在带有"if(!PyArray_Check(o))..."的注释行中给出了分段错误.

static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
{
    if(!o || o == Py_None)
    {
        if( !m.data )
            m.allocator …
Run Code Online (Sandbox Code Playgroud)

c++ python boost opencv boost-python

25
推荐指数
2
解决办法
1万
查看次数

使用boost :: python将python的回调传递给c ++

我想从我的python代码传递回调到c ++

我希望我的代码看起来像这样:在C++中:

typedef void (*MyCallback_t) (CallbackInfo);

class MyClass
{...
   void setcallback(MyCallback_t cb);
 ...
}
Run Code Online (Sandbox Code Playgroud)

并在python中使用它:

import mylib

def myCallback(mylib_CallbackInfo):
...

t = mylib.MyClass()
t.setcallback(myCallback)
Run Code Online (Sandbox Code Playgroud)

我在问题附近看到了一些话题,但无法解决

例如: 使用Python和C++实时处理和回调有建议使用boost :: python和关于GLI的警告,但没有示例.和这里

如何从一门外语线程(C++)调用Python函数有一个与Python代码的一部分,并以"BOOST_PYTHON_MODULE"部分没有充分说明

我还发现链接使用py_boost_function.hpp例如在Boost python howto但它没有编译和实际我无法理解如何使用它.

c++ python callback boost-python

24
推荐指数
1
解决办法
5449
查看次数

多态异常处理:如何捕获子类异常?

我有以下两个C++异常的简单层次结构:

class LIB_EXP ClusterException : public std::exception {
public:
    ClusterException() { }
    ClusterException(const std::string& what) { init(what); }
    virtual const char* what() const throw() { return what_.c_str(); }
    virtual ~ClusterException() throw() {}
    virtual ClusterException* clone() { return new ClusterException(*this);  } 
protected:
    void init(const std::string& what) { what_ = what; }
private:
    std::string what_;
};

class LIB_EXP ClusterExecutionException : public ClusterException {
public:
    ClusterExecutionException(const std::string& jsonResponse);
    std::string getErrorType() const throw() { return errorType_; }
    std::string getClusterResponse() const throw() { return clusterResponse_; …
Run Code Online (Sandbox Code Playgroud)

c++ python boost exception boost-python

24
推荐指数
1
解决办法
1169
查看次数

boost :: python导出自定义异常

我目前正在使用Boost.Python为Python编写C++扩展.此扩展中的函数可能会生成一个包含错误信息的异常(除了描述发生的事件的人类可读字符串之外).我希望我可以将这个异常导出到Python,这样我就能抓住它并用额外的信息做些什么.

例如:

import my_cpp_module
try:
    my_cpp_module.my_cpp_function()
except my_cpp_module.MyCPPException, e:
    print e.my_extra_data
Run Code Online (Sandbox Code Playgroud)

不幸的是,Boost.Python似乎将所有C++异常(都是其子类std::exception)转换为RuntimeError.我意识到Boost.Python允许一个人实现自定义异常转换,但是,需要使用PyErr_SetObject一个PyObject*(对于异常的类型)和一个PyObject*(对于异常的值) - 我都不知道如何从我的Boost中获取. Python类.也许有一种方法(这将是伟大的),我还没有找到.否则有人知道如何导出自定义C++异常,以便我可以在Python中捕获它吗?

c++ python exception boost-python

23
推荐指数
1
解决办法
7460
查看次数

Boost和Python 3.x

boost.python如何处理Python 3?它只是Python 2吗?

c++ python boost boost-python python-3.x

23
推荐指数
3
解决办法
3万
查看次数

将Python列表添加到使用Boost Python的向量中的函数中

我有一个带签名的功能:

function(std::vector<double> vector);
Run Code Online (Sandbox Code Playgroud)

而且我已经暴露了它,但它没有接受Python列表.我已经查看了其他的SO答案,并且大多数都涉及更改函数以接受boost :: python :: lists,但我不想更改函数.我想我可以使用vector_indexing_suite为这个函数编写一个简单的包装器,但是我有很多这种形式的函数,而不愿为每一个函数编写一个包装器.有没有办法自动生成Python list-> std :: vector映射?

boost iterator boost-python

23
推荐指数
1
解决办法
5424
查看次数

Boost.Python:如何公开std :: unique_ptr

我对boost.python相当新,并尝试将函数的返回值公开给python.

函数签名如下所示:

 std::unique_ptr<Message> someFunc(const std::string &str) const;
Run Code Online (Sandbox Code Playgroud)

在python中调用函数时,我收到以下错误:

TypeError: No to_python (by-value) converter found for C++ type: std::unique_ptr<Message, std::default_delete<Message> >
Run Code Online (Sandbox Code Playgroud)

我在python中的函数调用如下所示:

a = mymodule.MyClass()
a.someFunc("some string here") # error here
Run Code Online (Sandbox Code Playgroud)

我试图暴露std :: unique_ptr但只是无法让它工作..有人知道如何正确暴露指针类?谢谢!

编辑: 我尝试了以下内容:

class_<std::unique_ptr<Message, std::default_delete<Message>>, bost::noncopyable ("Message", init<>())

;
Run Code Online (Sandbox Code Playgroud)

这个例子编译,但我仍然得到上面提到的错误.此外,我试图暴露类Message本身

class_<Message>("Message", init<unsigned>())

        .def(init<unsigned, unsigned>()) 
        .def("f", &Message::f)
;
Run Code Online (Sandbox Code Playgroud)

c++ python unique-ptr boost-python c++11

23
推荐指数
1
解决办法
3128
查看次数

通过引用调用Boost.Python:TypeError:找不到C++类型的to_python(by-value)转换器:

我正在尝试使用Boost.Python将我的C++类公开给Python.这是我正在尝试做的简化版本:

我有一个派生自boost :: noncopyable的类A和一个带有一个方法的类B,该方法将A作为参数引用.

class A : boost::noncopyable { /*...*/ };

class B {

public:

    virtual void do_something(A& a) {
        /*...*/
    }
};
Run Code Online (Sandbox Code Playgroud)

我正在公开课程如下:

/* Wrapper for B, so B can be extended in python */
struct BWrap : public B, wrapper<B> {

    void do_something(A &a) {

        if (override do_something = this->get_override("do_something")) {
            do_something(a);
            return;
        }
        else {
            B::do_something(a);
        }
    }

    void default_do_something(A& a) { this->B::do_something(a); }
};

BOOST_PYTHON_MODULE(SomeModule) {

    class_<A, boost::noncopyable>("A");

    class_<BWrap, boost::noncopyable>("B")
        .def("do_something", &B::do_something, &BWrap::default_do_something)
    ;
}
Run Code Online (Sandbox Code Playgroud)

我像这样在python中扩展B: …

c++ python boost boost-python

20
推荐指数
1
解决办法
1万
查看次数

将C++类实例暴露给python嵌入式解释器

我正在寻找一种简单的方法将C++类实例暴露给python嵌入式解释器.

  • 我有一个C++库.这个库被包装(暂时使用swig),我可以从python解释器中使用它
  • 我有一个C++主程序,它从我的库中实现了一个Foo类并嵌入了一个python解释器

我想将我的C++世界Foo实例暴露给python世界(并被视为Foo类).

这是可能的,如果是这样,怎么样?

我认为这几乎就像在第一个答案中: boost :: python :: ptr或PyInstance_New用法

我想这意味着我应该boost.Python用来包装我的图书馆?

我唯一的目标是在嵌入式python解释器中操作我的Coo Coo实例(不确定它是否可以使用前面的方法完成).

希望我很清楚,谢谢你的帮助.

更新

谢谢你的回答.事实上,我已经将我的Foo类暴露给python(使用swig).

是)我有的:

我的Foo课程:

class Foo{...};
Run Code Online (Sandbox Code Playgroud)

我的包装库(包括Foo类)暴露给python:所以我可以启动python解释器并执行以下操作:

import my_module
foo=my_modulde.Foo()
Run Code Online (Sandbox Code Playgroud)

我想要的是:

有一个C++主程序嵌入python解释器并操纵C++世界变量.

int main(int argc, char **argv)
{
    Foo  foo;   // instanciates foo

    Py_Initialize();

    Py_Main(argc, argv); // starts the python interpreter
                         // and manipulates THE foo instance in it

    Py_Finalize();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在更清楚了吗?:)

c++ python swig boost boost-python

19
推荐指数
2
解决办法
5653
查看次数

地址清理Boost.Python模块

我的项目包括一个大型C++库和Python绑定(通过Boost.Python).测试套件主要是在Python绑定之上编写的,我想用清理程序运行它,从ASAN开始.

我正在运行macOS(10.13.1 FWIW,但我也遇到了以前版本的问题),我似乎找不到在Python模块上运行ASAN的方法(我非常怀疑这与Boost.Python有关) ,我想它与其他技术一样).

这是一个简单的Python模块:

// hello_ext.cc
#include <boost/python.hpp>

char const* greet()
{
  auto* res = new char[100];
  std::strcpy(res, "Hello, world!");
  delete [] res;
  return res;
}

BOOST_PYTHON_MODULE(hello_ext)
{
  using namespace boost::python;
  def("greet", greet);
}
Run Code Online (Sandbox Code Playgroud)

这是我使用的Makefile,为MacPorts制作:

// Makefile
CXX = clang++-mp-4.0
CXXFLAGS = -g -std=c++14 -fsanitize=address -fno-omit-frame-pointer
CPPFLAGS = -isystem/opt/local/include $$($(PYTHON_CONFIG) --includes)
LDFLAGS = -L/opt/local/lib
PYTHON = python3.5
PYTHON_CONFIG = python3.5-config
LIBS = -lboost_python3-mt $$($(PYTHON_CONFIG) --ldflags)

all: hello_ext.so

hello_ext.so: hello_ext.cc
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $< $(LIBS)

check: …
Run Code Online (Sandbox Code Playgroud)

c++ python boost-python address-sanitizer

19
推荐指数
2
解决办法
640
查看次数