我对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) 我已经在Qt Designer中为我的应用程序创建了第二个窗口.我读到QMainWindow将是第二个窗口的错误类(基本上应该只是某种对话框),所以我想改变基类.
我的问题是:
我有Selenium网络驱动程序的问题.我要做的是启动"便携式"chrome而不是本地安装,因为它有不同的设置.
问题是便携式Chrome(来自PortableApps)似乎只在使用GoogleChromePortable.exe时启动.如果我直接使用Chrome二进制文件,它将启动我的本地安装.使用Selenium似乎无论我传递给它的Chrome路径(GoogleChromePortable.exe或二进制路径),它都会启动我的本地安装.
这是我的代码:
String chromePath = "M:/my/path";
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
ChromeOptions options = new ChromeOptions();
capabilities.setCapability("chrome.binary", chromePath);
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
Run Code Online (Sandbox Code Playgroud)
任何想法如何能够启动我的便携式铬?谢谢
我想在我的 PHP 项目中实现一个过滤器功能。为了实现过滤器,我通常只在我的查询中添加一个 WHERE 子句来显示过滤的结果。
我的问题是:这些过滤器不仅需要添加一个简单的 WHERE 子句,还需要一个包含多个 JOIN的巨大查询。结果查询有 > 30 行。
稍后,还应该有一个搜索功能,然后也需要这个巨大的查询。我想知道这是否是一个好的做法,或者我是否应该在我的数据库表中添加一个“冗余”数据库列,在那里我计算每次更新时过滤所需的属性。有了这个专栏,我就不会对我的项目的不同地方进行大量查询,而是有一个多余的专栏。
你怎么认为?
你好
正如所质疑的,这里是表结构/代码。这不是确切的代码,因为还有一个修订系统使它变得更加复杂,但对于理解这已经足够了:
表格提交:
ID (primary)
(additionalColumns)
Run Code Online (Sandbox Code Playgroud)
表格报告:
ID (primary)
submissionID (reference to submission table)
(additionalColumns)
Run Code Online (Sandbox Code Playgroud)
表report_objects:
reportID (reference to reports table, multiple report_object for one report)
Run Code Online (Sandbox Code Playgroud)
表记账:
ID (primary)
reportID (reference to reports table, multiple accountings for one report)
(additionalColumns)
Run Code Online (Sandbox Code Playgroud)
表accounting_objects:
ID
accountingID (reference to accounting table, multiple accounting_object for one accounting)
(additionalColumns)
Run Code Online (Sandbox Code Playgroud)
对于提交,正在创建一个或多个报告,其中包含多个对象 (report_objects)。对于每个报表,我可以创建多个记帐,其中每个记帐针对报表的几个对象。会计报表对象存储在accounting_object
我的查询/过滤器会检查一个 submitID 的每个 report_object 是否都针对一个 submitID 进行了计算(accounting_object 存在)。
在python中调用C++函数时遇到一个奇怪的问题.
我公开了一个我想要调用函数的类:
class_<MyClass, std::shared_ptr<MyClass>>("MyClass", init<>())
// ...
.def("someFunc", &MyClass::someFunc)
;
Run Code Online (Sandbox Code Playgroud)
我std::shared_ptr<MyClass>从另一个通过公开的类中获取一个成员变量.def_readonly(...)
当我尝试调用该函数时,我收到以下错误:
File "pytest.py", line 27, in test_func
cu.someFunc("string")
Boost.Python.ArgumentError: Python argument types in
MyClass.someFunc(MyClass, str)
did not match C++ signature:
result(MyClass{lvalue}, std::string)
Run Code Online (Sandbox Code Playgroud)
据我所知,签名确实匹配.有人看到了这个问题吗?
我正在使用一个非我自己编写的库.有些类在其头文件中声明了类似的构造函数
class SomeClass {
public:
SomeClass(const SomeClass& orig);
// more declarations
}
Run Code Online (Sandbox Code Playgroud)
但是.cpp文件中没有实现.为什么代码编译呢?
我在使用boost.python暴露的现有C++库中集成boost.signals2时遇到问题.
我有一个暴露于python的类std::shared_ptr.这个类应该能够在某些事件上提出一些信号.因此我暴露了connect_slot一个boost::python::object以参数为参数的函数.如果我在连接一个插槽后直接发出一个信号,一切正常,但是如果该类后来提升信号,我会收到分段错误.
我认为这可能与c ++ lib中的线程有关(它也使用了boost :: asio等)
以下是一些代码段:
MyClass.h:
public:
typedef boost::signals2::signal<void (std::shared_ptr<int>)> signal_my_sig;
void connect_slot(boost::python::object const & slot);
private:
signal_my_sig m_sig;
Run Code Online (Sandbox Code Playgroud)
MyClass.cpp:
void MyClass::connect_slot(boost::python::object const & slot) {
std::cout << "register shd" << std::endl;
m_sig.connect(slot);
m_sig(12345); // this works
}
void MyClass::some_later_event() {
m_sig(654321); // this does not work
}
Run Code Online (Sandbox Code Playgroud)
我在python中用自定义python函数调用MyClass :: connect_slot函数,如下所示:
def testfunc(some_int):
print("slot called")
m = myext.MyClass()
m.connect_slot(testfunc)
Run Code Online (Sandbox Code Playgroud)
引发的分段错误的回溯(使用gdb)MyClass::some_later_event如下所示:
[Thread debugging using libthread_db enabled]
Using host libthread_db library …Run Code Online (Sandbox Code Playgroud)