我最近发现了boost-python的存在,并且很惊讶它的简单性.我想尝试一下并开始包装现有的C++库.
虽然包装基本库API调用非常简单(没有什么特别的,只是常规函数调用和非常常见的参数),但我不知道如何正确包装初始化/清理函数:
就目前而言,我的C++库要求调用者mylib::initialize()在程序启动时首先调用,并mylib::cleanup()在它结束之前调用(实际上还有一个初始化器对象来处理它,但它可能是无关紧要的).
我应该如何使用boost python包装它?
强制Python用户调用mymodule.initialize(),mymodule.cleanup()似乎不是非常pythonic.有没有办法以自动方式?理想情况下,调用initialize()将在导入模块时透明地完成,并且调用cleanup()也在python脚本结束时完成.
有没有办法做到这一点?如果没有,最优雅的解决方案是什么?
谢谢.
我正在尝试将对象存储在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 ++ 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?
我目前正在尝试使用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) 如何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.
我正在使用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++编写的代码:
#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.
我正在尝试通过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) 我对boost.python完全不熟悉.我回顾了很多推荐使用boost.python来应用python,但是仍然不容易理解并为我找到解决方案.
我想要的是直接从python"SourceFile"导入一个函数或类
示例文件:Main.cpp MyPythonClass.py
让我们说如果"MyPythonClass.py"中有一个带有"bark()"函数的"Dog"类,我如何在cpp中获得回调和发送参数?
我不知道该怎么做!请帮我!
假设我有一个像这样的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)
但是我尝试过的此代码的许多变体都没有用。为了做到这一点,我需要在代码中注入什么魔力?
boost-python ×10
c++ ×10
boost ×7
python ×7
archlinux ×1
c++11 ×1
python-2.6 ×1
shared-ptr ×1
std ×1