我已经为我的 c++ 应用程序的核心功能添加了 python 绑定,现在我正在尝试在各处添加文档字符串,以便我可以使用 sphinx 自动记录公开的 python。
它几乎可以工作,但是当我有静态属性(使用 add_static_property 方法添加)时,我无法覆盖文档字符串。我的一个返回浮点数的属性就是一个例子:
MyClass.static_property.__doc__
float(x) -> floating point number
Run Code Online (Sandbox Code Playgroud)
当我使用 def 方法或 property 方法时,最后一个参数允许我添加我的文档字符串。有谁知道为什么不能对静态属性执行此操作?有什么办法允许他们这样做吗?
非常感谢
我正在尝试覆盖通过 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 函数定义)
有任何想法吗?
我正在尝试将两个重载函数导出到 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) 好吧,我已经检查了一段时间,找不到答案。
\n\n我想附加一个暴露给 python 的对象,比如 Foo:
\n\nstruct Foo {\n Foo(){ std::cout << "Creating a Foo object" << std::endl;}\n virtual ~Foo(){ std::cout << "Destroying a Foo object" << std::endl;}\n};\nRun Code Online (Sandbox Code Playgroud)\n\n我使用 Foo 继承的对象,有时我想将它们附加到 python 列表中。为此,我创建了一个 FooWrapper,它继承自 Foo 并使用复制构造函数
\n\nstruct 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};\nRun Code Online (Sandbox Code Playgroud)\n\n这是暴露给Python的:
\n\nBOOST_PYTHON_MODULE(foo_module)\n{\n using namespace py = boost::python;\n py::class_<FooWrapper>("FooWrapper", …Run Code Online (Sandbox Code Playgroud) 考虑到相应 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++ 类的实例并使用 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) 我正在迈出第一步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)
我有很多错误。我做错了什么?我正在阅读有关政策的信息,但在这里我认为我不必申请其中的一些政策,对吗?
亲切的问候
美国空军
我正在使用Boost Python为wxWidgets子集创建绑定.wxWidgets中的窗口对象不应手动删除,因为它们处理自己的删除:例如,当用户单击关闭按钮关闭顶级窗口时,它会自动删除自身.如果一个窗口被删除,奇怪的事情将事件处理程序等情况的发生
(详情:http://docs.wxwidgets.org/2.8/wx_windowdeletionoverview.html)
但是这导致了在Python中创建的窗口对象的问题:在垃圾收集时,C++对象总是被删除!
有没有办法告诉Boost Python不要拥有它创建的C++对象?或许类似于构造函数的调用策略?
(另外,我有点担心如何处理从C++中删除的对象.当关联的C++对象被删除时,Python对象会发生什么?Python不会以任何方式得到通知.)
我向Python公开了一些嵌套enum的C++类.查看boost.org和wiki.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) 我正在尝试通过Python在我的游戏引擎中创建一个很好的界面来进行HTTP调用,但是我遇到了一些问题.
我有一个函数,get_async它启动指定URL 的curl请求.该函数在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)