Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用boost和Firebreath从python中正确触发浏览器事件 首先,我必须说,作为一个Python程序员,我可能从错误的角度看待这个问题,自从我在大学写了我的最后一个C++代码以来,很多年过去了。_C++_Python_Boost_Boost Python_Firebreath - Fatal编程技术网

如何使用boost和Firebreath从python中正确触发浏览器事件 首先,我必须说,作为一个Python程序员,我可能从错误的角度看待这个问题,自从我在大学写了我的最后一个C++代码以来,很多年过去了。

如何使用boost和Firebreath从python中正确触发浏览器事件 首先,我必须说,作为一个Python程序员,我可能从错误的角度看待这个问题,自从我在大学写了我的最后一个C++代码以来,很多年过去了。,c++,python,boost,boost-python,firebreath,C++,Python,Boost,Boost Python,Firebreath,我遇到了一点问题,试图使用firebreath创建一个混合python/c++插件。到目前为止,我已经成功地使用boost/python.h集成了所有部分,但是当我试图从python内部触发事件时出现了一个问题。我遇到了一个问题,就是必须用一个C++函数绑定一个Python函数(使用BooStpyPythOnMax模块)。首先,我尝试用我的JSAPI派生类FBestTyPyPythOnAPI绑定Python,这个方法的问题似乎是缺少对浏览器实例化的JSAPI对象的引用,它给了我在执行时Pytho

我遇到了一点问题,试图使用firebreath创建一个混合python/c++插件。到目前为止,我已经成功地使用boost/python.h集成了所有部分,但是当我试图从python内部触发事件时出现了一个问题。我遇到了一个问题,就是必须用一个C++函数绑定一个Python函数(使用BooStpyPythOnMax模块)。首先,我尝试用我的JSAPI派生类FBestTyPyPythOnAPI绑定Python,这个方法的问题似乎是缺少对浏览器实例化的JSAPI对象的引用,它给了我在执行时Python函数和C++等价物之间的各种签名错配问题。p> 我唯一想到要解决这个问题(我同意,这是一个丑陋肮脏的解决方案),就是使用一个全局指针,我用set_pluginPointer手动初始化它。到目前为止,这确实很有效,但我知道这不是正确的方法。我读到我不应该将“原始”指针与JSAPI对象一起使用,但我不确定如何将其替换为这个特定实现的共享_ptr。另一个问题是全局变量,它是所有实例的共享访问,例如,导致在最后打开的选项卡/窗口上触发所有事件。解决后者的一种方法是创建某种数组,其中索引是当前窗口/线程id,我应该能够从JSAPI对象和python/c++函数访问它

当然,对于如何改进/修复这一特定的解决方法,或者更好地,如何在不进行黑客攻击的情况下正确地沟通boost::python和firebreath,我持开放态度,并将非常感谢任何建议

下面是插件代码的相关部分

// Global pointer to plugin instance
fbtestconpythonAPI *fbtestPtr;
void fbtestconpythonAPI::set_pluginPointer(const std::string& val){
    m_testString = val;
    fbtestPtr = this; //Global pointer initialization
}

void echo(std::string x){
    // Firing the echo event on the plugin instance using the global raw pointer
    fbtestPtr->fire_echo(x, 1);
}

BOOST_PYTHON_MODULE(Pointless) {
    def("echo", echo);
}

FB::variant fbtestconpythonAPI::echo(const FB::variant& msg){
    int result_value;
    Py_Initialize(); 

    try {
        initPointless(); // initialize Pointless

        PyRun_SimpleString("import Pointless");
        PyRun_SimpleString("Pointless.echo('hello world')");

        object module(handle<>(borrowed(PyImport_AddModule("__main__"))));
        object dictionary = module.attr("__dict__");
    } catch (error_already_set) {
        PyErr_Print();
    }

    Py_Finalize();
    return 0;
}
//指向插件实例的全局指针
fbtestconpythonAPI*fbtestPtr;
void fbtestconpythonAPI::set_pluginPointer(const std::string&val){
m_testString=val;
fbtestPtr=this;//全局指针初始化
}
无效回显(标准::字符串x){
//使用全局原始指针在插件实例上触发echo事件
fbtestPtr->fire_echo(x,1);
}
BOOST_PYTHON_模块(无意义){
def(“echo”,echo);
}
FB::variant fbtestconpythonAPI::echo(const FB::variant&msg){
int结果_值;
Py_初始化();
试一试{
initPointless();//初始化无意义
PyRun_SimpleString(“导入无意义”);
PyRun_SimpleString(“Pointless.echo('hello world')”);
对象模块(句柄(借用的(PyImport\u AddModule(“\uuu main\uuuu”)));
对象字典=module.attr(“\uuuu dict\uuuuuu”);
}捕获(已设置错误){
PyErr_Print();
}
Py_Finalize();
返回0;
}

通过快速查看,您可以如下所示设置导出类:

class_<YourAPI, boost::noncopyable>("YourAPI", no_init)
    .def("function", &YourAPI::function);
类(“YourAPI”,无初始化)
.def(“函数”和YourAPI::函数);

然后你可以将你的C++实例传递给Python,允许你调用它上的函数,而函数又可以触发事件。p> 我还没有使用Boost.Python,但您似乎应该研究如何将Python对象绑定到FireBreath插件实例,而不是试图让变通方法(自由函数+全局函数)发挥作用。我建议您就最初的问题提问。谢谢您的评论。也许我不是很清楚,请原谅我,因为英语不是我的第一语言,我的意思是,任何关于如何做到这一点的建议(connect boost:python with firebreath)都将受到高度赞赏。我只是想和大家分享我提出的解决方案,从回答中排除这个问题。我明白了,我只是误解了你。非常感谢Georg。我马上就开始调查