标签: boost-python

boost::python 中静态属性的文档字符串

我已经为我的 c++ 应用程序的核心功能添加了 python 绑定,现在我正在尝试在各处添加文档字符串,以便我可以使用 sphinx 自动记录公开的 python。

它几乎可以工作,但是当我有静态属性(使用 add_static_property 方法添加)时,我无法覆盖文档字符串。我的一个返回浮点数的属性就是一个例子:

MyClass.static_property.__doc__
float(x) -> floating point number
Run Code Online (Sandbox Code Playgroud)

当我使用 def 方法或 property 方法时,最后一个参数允许我添加我的文档字符串。有谁知道为什么不能对静态属性执行此操作?有什么办法允许他们这样做吗?

非常感谢

c++ boost-python

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

Boost Python 重写相等运算符

我正在尝试覆盖通过 boost python 公开的类的 python 相等运算符。

所以我的代码看起来像这样:

   class_<MyClass, boost::noncopyable, boost::shared_ptr<MyClass> >("MyClass", no_init)
    .def("foo", &MyClass::foo)                                    
     .
     .
     .
    .def("__eq__", &MyClass::operator==) 
    .def("__ne__", &MyClass::operator!=)
Run Code Online (Sandbox Code Playgroud)

然而在 python 中,当我获取代表相同 C++ 对象但来自不同 python 对象的对象的 2 个实例时,它们永远不相等......

因此:

from myPackage import myClass

v1 = myClass.get("abc")
v2 = myClass.get("abc")
if v1 == v2:
   print "true"
else:
   print "false"
Run Code Online (Sandbox Code Playgroud)

总是打印错误。(为了简单起见,我省略了对象中的 get 函数定义)

有任何想法吗?

c++ python boost boost-python

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

导出函数时boost python模板参数推导/替换失败

我正在尝试将两个重载函数导出到 Python。因此,我首先定义指向这些函数的指针,然后使用它们将函数公开给 Python。

BOOST_PYTHON_MODULE(mylib){

    // First define pointers to overloaded function
    double (*expt_pseudopot02_v1)(double,double,double,const VECTOR&,
                                  int,int,int,double,const VECTOR&,
                                  int,int,int,double,const VECTOR& ) = &pseudopot02;

    boost::python::list (*expt_pseudopot02_v2)(double, double, double, const VECTOR&,
                            int,int,int,double, const VECTOR&,
                            int,int,int,double, const VECTOR&,  int, int ) = &pseudopot02;

    // Now export 
    def("pseudopot02", expt_pseudopot02_v1); // this works fine!
    //def("pseudopot02", expt_pseudopot02_v2); // this one gives the problem!

}
Run Code Online (Sandbox Code Playgroud)

第一个导出功能工作正常。第二个(目前评论)失败,给出错误:

template argument deduction/substitution failed
Run Code Online (Sandbox Code Playgroud)

它还打印了这个解释:

...../boost_1_50_0/boost/python/make_function.hpp:104:59: note:   mismatched types ‘RT (ClassT::*)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, …
Run Code Online (Sandbox Code Playgroud)

c++ python boost boost-python

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

将 C++ 创建的对象追加到 python 列表并使其由 python 管理

好吧,我已经检查了一段时间,找不到答案。

\n\n

我想附加一个暴露给 python 的对象,比如 Foo:

\n\n
struct Foo {\n  Foo(){ std::cout << "Creating a Foo object" << std::endl;}\n  virtual ~Foo(){ std::cout << "Destroying a Foo object" << std::endl;}\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用 Foo 继承的对象,有时我想将它们附加到 python 列表中。为此,我创建了一个 FooWrapper,它继承自 Foo 并使用复制构造函数

\n\n
struct FooWrapper : public Foo {\n  FooWrapper(const Foo& foo):Foo(foo){ std::cout << "Creating a copy from foo using FooWrapper" << std::endl;}  \n  virtual ~FooWrapper(){ std::cout << "Destroying a FooWrapper object" << std::endl;}\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是暴露给Python的:

\n\n
BOOST_PYTHON_MODULE(foo_module)\n{\n    using namespace py = boost::python;\n    py::class_<FooWrapper>("FooWrapper", …
Run Code Online (Sandbox Code Playgroud)

boost memory-management list boost-python

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

boost::python 包装对象的 C++ 析构函数调用

考虑到相应 python 对象的引用计数达到零的时刻,当调用包装对象的 C++ 析构函数时,boost::python 是否提供任何保证?

我担心一个 C++ 对象打开一个文件进行写入并在其析构函数中执行文件关闭。当对对象的所有 python 引用都被删除或超出范围时,是否保证写入文件?

我是说:

A=MyBoostPythonObject()
del A # Is the C++ destructor of MyBoostPythonObject called here?
Run Code Online (Sandbox Code Playgroud)

我的经验表明,析构函数总是在此时被调用,但对此找不到任何保证。

c++ python boost-python

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

无法在 Boost Python 中返回类的实例

我正在尝试返回 C++ 类的实例并使用 Boost.Python 将其返回给 Python。我想做的是有这样的代码:

class foo {
    std::string name;
    public:
    void set_name(std::string name) {this->name = name;}
    std::string get_name() {return this->name;}
};
class bar {
    public:
    foo get_foo(std::string name) {
        foo my_foo;
        my_foo.set_name(name);
        return my_foo;
    }
};
Run Code Online (Sandbox Code Playgroud)

我用以下内容包裹它:

BOOST_PYTHON_MODULE(foobar)
{
    class_<foo, boost::noncopyable>("foo")
    .def("set_name", &foo::set_name)
    .def("get_name", &foo::get_name)
;

    class_<bar, boost::noncopyable>("bar")
    .def("get_foo", &bar::get_foo);
 }
Run Code Online (Sandbox Code Playgroud)

您可能也注意到了,我需要 foo 和 bar 都是不可复制的,因为在实际项目中,里面有套接字。当尝试编译上面的内容时,我收到一个 Python TypeError:

TypeError: No to_python (by-value) converter found for C++ type
Run Code Online (Sandbox Code Playgroud)

我用Python这样调用它:

Python 3.6.1 (default, Mar 22 2017, 06:17:05) 
[GCC 6.3.0 20170321] …
Run Code Online (Sandbox Code Playgroud)

c++ python boost class boost-python

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

传递没有所有权的简单指针来增强python

我正在迈出第一步boost python来测试我的班级,但是在为我的班级声明python模块时遇到了困难。

我的课程接受指向另一个课程的指针,但我不知道如何声明

class A{ };

class B
{
    B( std::string& name, A* ptr ){ 
        std::cot << ptr->data << std::endl; // no ownership
    }
    void my_foo(){
        // do something!
    }
};
Run Code Online (Sandbox Code Playgroud)

我将A类导出到python,但B类面临问题

class_< B >("B", init< std::string, A >() )
{
    .def("my_foo", &B::my_foo);   
}
Run Code Online (Sandbox Code Playgroud)

我有很多错误。我做错了什么?我正在阅读有关政策的信息,但在这里我认为我不必申请其中的一些政策,对吗?

亲切的问候

美国空军

c++ word-wrap boost-python

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

Make Boost Python不会删除析构函数中的C++对象

我正在使用Boost Python为wxWidgets子集创建绑定.wxWidgets中的窗口对象不应手动删除,因为它们处理自己的删除:例如,当用户单击关闭按钮关闭顶级窗口时,它会自动删除自身.如果一个窗口删除,奇怪的事情将事件处理程序等情况的发生

(详情:http://docs.wxwidgets.org/2.8/wx_windowdeletionoverview.html)

但是这导致了在Python中创建的窗口对象的问题:在垃圾收集时,C++对象总是被删除!

有没有办法告诉Boost Python不要拥有它创建的C++对象?或许类似于构造函数的调用策略?

(另外,我有点担心如何处理从C++中删除的对象.当关联的C++对象被删除时,Python对象会发生什么?Python不会以任何方式得到通知.)

wxwidgets boost-python

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

Boost.Python - 如何重新输入模块范围?

我向Python公开了一些嵌套enum的C++类.查看boost.orgwiki.python.org上的示例文档,我无法看到在输入范围后如何离开范围,以便返回到全局/模块范围.相反,每个后续范围都嵌套在前一个范围内.

举个例子:

#include <boost/python.hpp>

class Foo
{
public:
    enum Choose { eFoo, eBar };

    /* Default constructor with enum as required argument */
    Foo(Choose choice): m_choice(choice) {}
    ~Foo() {}

    Choose get() const { return m_choice; }

private:
    const Choose m_choice;

};


class Bar
{
};

BOOST_PYTHON_MODULE(foo)
{
    using namespace boost::python;
    scope global;

    /* Define Foo class, and a scope to go with it. */
    scope in_Foo = class_<Foo>
        ("Foo", init<Foo::Choose>())
        .def("rovalue", &Foo::get)
        ;

    /* …
Run Code Online (Sandbox Code Playgroud)

c++ python scope boost-python

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

使用默认参数将特定参数传递给Boost Python函数

我正在尝试通过Python在我的游戏引擎中创建一个很好的界面来进行HTTP调用,但是我遇到了一些问题.

我有一个函数,get_async它启动指定URL 的请求.该函数在http_manager类中定义,如下所示:

struct http_manager
{
    typedef function<void(boost::shared_ptr<http_response>)> response_callback_type;
    typedef function<void(size_t)> write_callback_type;

    void get_async(
        const string& url,
        const http_headers_type& headers = http_headers_type(),
        const http_data_type& data = http_data_type(),
        response_callback_type on_response = nullptr,
        write_callback_type on_write = nullptr
        );
};
Run Code Online (Sandbox Code Playgroud)

我能够在Python中成功进行此调用:

http.get_async('http://www.google.ca')
Run Code Online (Sandbox Code Playgroud)

但是,我想打个电话:

http.get_async('http://www.google.ca', on_response=f)
Run Code Online (Sandbox Code Playgroud)

这里的关键是我希望通过名称显式指定参数,并让所有其他参数成为默认值,就像在常规Python中一样.

不幸的是,当我这样做时,我从Python得到以下错误:

ArgumentError: Python argument types in
    HttpManager.get_async(HttpManager, str)
did not match C++ signature:
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url)
    get_async(struct naga::http_manager {lvalue}, class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > url, …
Run Code Online (Sandbox Code Playgroud)

c++ python boost boost-python

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