2012-02-16 2 views
3

먼저 파이썬 프로그래머로서이 문제를 잘못된 시각에서 보았을 것입니다. 마지막 C++ 코드를 작성한 이후로 오랜 세월이 흘렀습니다. 칼리지.부스트와 Firebreath를 사용하여 Python 내에서 브라우저 이벤트를 올바르게 실행하는 방법

나는 firebreath를 사용하여 하이브리드 python/C++ 플러그인을 만들려고하는데 약간의 문제가 있습니다. 지금까지 boost/python.h를 사용하여 모든 부분을 통합하는 데는 성공했지만 문제는 파이썬 안에서 이벤트를 발생 시키려고했을 때 발생했습니다. 나는 BOOST_PYTHON_MODULE을 사용하여 C++ 함수로 파이썬 함수를 묶어야하는 문제를 발견했다. 먼저 Python을 JSAPI 파생 클래스 인 fbtestconpythonAPI로 직접 바인딩하려고했는데,이 접근법의 문제점은 브라우저에서 인스턴스화 된 JSAPI 객체에 대한 참조가 부족하여 Python 함수와 C++에서 동일한 종류의 모든 서명 불일치 문제가 발생했습니다. 실행 시간.

이 문제를 해결하기 위해 필자가 골치 아픈 유일한 해결책은 set_pluginPointer를 사용하여 손으로 초기화하는 전역 포인터를 사용하는 것입니다. 지금까지는 실제로 실제로 잘 작동하지만 올바른 방법이 아니라는 것을 알고 있습니다. 나는 JSAPI 객체와 함께 "raw"포인터를 사용하지 말아야한다는 것을 알았지 만,이 특정 구현을 위해 shared_ptr로 대체하는 방법을 모르겠습니다. 또 다른 문제점은 전역 변수로, 모든 인스턴스에 걸쳐 공유되며 예를 들어 마지막 탭/창에서 모든 이벤트가 시작됨을 유발합니다. 후자를 해결하는 한 가지 방법은 인덱스가 현재 창/스레드 ID 인 일종의 배열을 만드는 것입니다.이 방법은 JSAPI 개체와 Python/C++ 함수 모두에서 액세스 할 수 있어야합니다.

물론이 특정 해결 방법을 개선하거나 수정하는 방법에 대해 많은 제안을 부탁드립니다. 해킹없이 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; 
} 
+0

아직 Boost.Python을 사용하지는 못했지만 해결 방법 (무료 함수 + 전역 변수)을 얻는 대신 FireBreath 플러그인 인스턴스에 파이썬 객체를 바인딩하는 방법을 조사해야합니다. 초기 문제에 대해 질문하는 것이 좋습니다. –

+0

주석 주셔서 감사합니다. 어쩌면 나는 아주 명확하지 않았다. 영어가 나의 모국어가 아니기 때문에 나에게 용서해주세요, 나는 이것을 의미하는 어떤 종류의 제안이라도 (Firebreath와 함께 파이썬 연결) 파이썬을 매우 높이 평가할 것입니다. 나는 방금 내가 생각해 낸 해결책을 공유하기를 원했고, 대답에서 그 것을 배제하기 위해서 – skalanux

+0

나는 그저 당신을 오해했다. –

답변

1

의 관련 부분 당신 설치 것 같은 수출을위한 클래스 :

class_<YourAPI, boost::noncopyable>("YourAPI", no_init) 
    .def("function", &YourAPI::function); 

그럼 당신은 당신의 C에 a reference를 전달할 수 ++ 인스턴스를 파이썬에 전달하면 함수를 호출하여 이벤트를 발생시킬 수 있습니다.

+0

Georg 대단히 감사합니다. 나는 곧바로 그것을 살펴볼 것입니다. – skalanux