标签: boost-python

如何在Boost python中包装init/cleanup函数

我最近发现了boost-python的存在,并且很惊讶它的简单性.我想尝试一下并开始包装现有的C++库.

虽然包装基本库API调用非常简单(没有什么特别的,只是常规函数调用和非常常见的参数),但我不知道如何正确包装初始化/清理函数:

就目前而言,我的C++库要求调用者mylib::initialize()在程序启动时首先调用,并mylib::cleanup()在它结束之前调用(实际上还有一个初始化器对象来处理它,但它可能是无关紧要的).

我应该如何使用boost python包装它?

强制Python用户调用mymodule.initialize(),mymodule.cleanup()似乎不是非常pythonic.有没有办法以自动方式?理想情况下,调用initialize()将在导入模块时透明地完成,并且调用cleanup()也在python脚本结束时完成.

有没有办法做到这一点?如果没有,最优雅的解决方案是什么?

谢谢.

c++ python boost-python

6
推荐指数
1
解决办法
1069
查看次数

boost :: python和set :: erase - >奇怪的行为

我正在尝试将对象存储在std :: set中.这些对象是来自python环境的boost :: shared_ptr <>.向集合中添加值不会导致任何麻烦.但是当我尝试擦除一个值时,即使我传递了相同的引用,它也无法工作.这是一个例子:

#include <set>
#include <iostream>

#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

using namespace std;
using namespace boost;
using namespace boost::python;

struct Bar
{
    Bar() {}
};

struct Foo
{
    set< shared_ptr<Bar> > v_set;
    shared_ptr<Bar> v_ptr;

    Foo() {}

    void add( shared_ptr<Bar> v_param ) {
    cout << "storing " << v_param << "in v_set and v_ptr" << endl;
    v_set.insert(v_param);
    v_ptr = v_param;

    }

    void del( shared_ptr<Bar> v_param ) {
    cout << "deleting " << v_param << endl;
    if (v_param …
Run Code Online (Sandbox Code Playgroud)

c++ boost shared-ptr boost-python c++11

6
推荐指数
1
解决办法
221
查看次数

通过boost :: python将C++对象传递给python函数

我想在c ++ app中使用embed python并调用python脚本中定义的函数.函数的参数是一个c ++对象.看我的代码:

class Test
{
public:
    void f()
    {
        std::cout<<"sss"<<std::endl;
    }
};

int main()
{
    Py_Initialize();
    boost::python::object main = boost::python::import("__main__");
    boost::python::object global(main.attr("__dict__"));
    boost::python::object result = boost::python::exec_file("E:\\python2.py", global, global);
    boost::python::object foo = global["foo"];
    if(!foo.is_none())
    {
        boost::python::object pyo(boost::shared_ptr<Test>(new Test())); // compile error
        foo(pyo);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

python2.py:

def foo(o):
    o.f()
Run Code Online (Sandbox Code Playgroud)

如何将c ++对象传递给foo?我知道swig可以做到这一点,但是boost :: python?

c++ boost-python

6
推荐指数
1
解决办法
4258
查看次数

Boost Python:导入模块时遇到问题

我目前正在尝试使用Boost Python导出一个类,然后在相应的程序中使用它.

/**
    main.cpp
*/
#define BOOST_PYTHON_STATIC_LIB
#include <Resource\ZipResourceFile.hpp>
#include <Resource\ResourceCache.hpp>
#include <Windows.h>
#include <boost/python.hpp>
#include <iostream>

/* a simple add method, for s & g's */
int add(int a, int b)
{
    return a + b;
}

/* Foo class*/
class Foo
{
public:
    Foo(int n);
    ~Foo();
    void f();
};

/* Foo ctor, does nothingm just wanted to pass and arg */
Foo::Foo(int n)
{

}

/* destructor */
Foo::~Foo()
{
}

/* f() implementation, calls Foo!!! to cout …
Run Code Online (Sandbox Code Playgroud)

c++ python boost boost-python

6
推荐指数
1
解决办法
2038
查看次数

如何使用boost :: python将std :: pair暴露给python?

如何std::pair使用boost::python?当我曝光时,vector<string>我只需写:

class_<std::vector<std::string> >("StringVec")
    .def(vector_indexing_suite<std::vector<std::string> >())
;
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理std :: pair.

c++ python boost std boost-python

6
推荐指数
2
解决办法
2376
查看次数

将指针从C++传递给Python/w boost python?

我正在使用Boost Python,我在C++中生成一个大的整数向量,我想在Python中访问这个向量而不复制它.

在C++中我有:

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>());
}

vector<int>* ReturnVectorPtr()
{
    return new vector<int>();
}
Run Code Online (Sandbox Code Playgroud)

然后在python我有:

import myModule
myModule.ReturnVectorPtr()
Run Code Online (Sandbox Code Playgroud)

这会导致Python崩溃,尽管我甚至没有存储返回值.关于我的错误是什么想法?

编辑:

以下代码用于将向量中的数据从C++获取到python,但泄漏内存.是否复制了矢量然后没有处理?

在C++中:

BOOST_PYTHON_MODULE(myModule)
{
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>());
    def("ModifyVectorInPlace", ModifyVectorInPlace);
}

void ModifyVectorInPlace(vector<int>& data)
{
    // Modify data...
    return;
}
Run Code Online (Sandbox Code Playgroud)

然后在python我有:

import myModule
vectorInt = myModule.vectorInt()
myModule.ModifyVectorInPlace(vectorInt)
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

编辑2:

我从这里尝试了"Raw C++ Pointers"示例,完全如下所示:https: //wiki.python.org/moin/boost.python/PointersAndSmartPointers

它也崩溃了.似乎我无法获得指向任何因某些原因传入Python的指针......

编辑3:

崩溃似乎是来自invoke.hpp的段错误,在此函数中:

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)>
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) …
Run Code Online (Sandbox Code Playgroud)

c++ python boost boost-python

6
推荐指数
1
解决办法
1859
查看次数

ImportError:/usr/lib/libboost_python.so.1.54.0:未定义的符号:PyClass_Type

我有用C++编写的代码:

#include <boost/python.hpp>

char const* greet()
{
  return "Yay!";
}

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

现在我想通过以下方式将此动态库导入到python:

import libtest
Run Code Online (Sandbox Code Playgroud)

但我得到:

ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我的操作系统是Arch Linux.

c++ python boost boost-python archlinux

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

在一个共享对象中增加python多个模块

我正在尝试通过boost python创建一个包含几个模块的包.

原因是我们希望公开一个非常大的API,将它组合在不同的模块中以便于使用和保留python内存使用是有意义的.另一方面,我们被迫(由于超出此问题范围的原因将其编译为单个共享对象)

所以我用boost python创建了一个导出几个模块的包,如下所示:

void exportClass1()
{
    namespace bp = boost::python;
    // map the IO namespace to a sub-module
    // make "from myPackage.class1 import <whatever>" work
    bp::object class1Module(bp::handle<>(bp::borrowed(PyImport_AddModule("myPackage.class1"))));
    // make "from mypackage import class1" work
    bp::scope().attr("class1") = class1Module;
    // set the current scope to the new sub-module
    bp::scope io_scope = class1Module;

    // export stuff in the class1 namespace

    class_<class1 >("class1", init<>())
    .
    .   CLASS SPECIFICS GO HERE
    .

    Other class of module class1 go here …
Run Code Online (Sandbox Code Playgroud)

c++ python boost python-2.6 boost-python

6
推荐指数
1
解决办法
1497
查看次数

如何通过Boost.Python从python文件导入函数

我对boost.python完全不熟悉.我回顾了很多推荐使用boost.python来应用python,但是仍然不容易理解并为我找到解决方案.

我想要的是直接从python"SourceFile"导入一个函数或类

示例文件:Main.cpp MyPythonClass.py

让我们说如果"MyPythonClass.py"中有一个带有"bark()"函数的"Dog"类,我如何在cpp中获得回调和发送参数?

我不知道该怎么做!请帮我!

c++ python boost-python

6
推荐指数
1
解决办法
4762
查看次数

如何使用boost :: python创建和使用Python对象的实例

假设我有一个像这样的Python类:

class MyPythonClass:
    def Func1(self, param):
        return
    def Func2(self, strParam):
        return strParam
Run Code Online (Sandbox Code Playgroud)

如果我想在我的C ++代码中嵌入包含该类的Python脚本,请通过我的C ++代码创建该对象的实例,然后在该python对象上调用成员,我该如何处理?

我认为应该是这样的:

namespace python = boost::python;
python::object main = python::import("main");
python::object mainNamespace = main.attr("__dict__");
python::object script = python::exec_file(path_to_my_script, mainNamespace);
python::object foo = mainNamespace.attr("MyPythonClass")();
python::str func2return = foo.attr("Func2")("hola");
assert(func2return == "hola");
Run Code Online (Sandbox Code Playgroud)

但是我尝试过的此代码的许多变体都没有用。为了做到这一点,我需要在代码中注入什么魔力?

c++ boost boost-python

6
推荐指数
1
解决办法
771
查看次数

标签 统计

boost-python ×10

c++ ×10

boost ×7

python ×7

archlinux ×1

c++11 ×1

python-2.6 ×1

shared-ptr ×1

std ×1