PythonQt試用手記

原文地址:http://blog.csdn.net/jingwenlai_scut/article/details/5325448python

簡介:shell

PythonQt是從商業軟件中的MEVISLIB中剝離出來的腳本引擎部分,其能夠方便地將Python嵌入到CPP工程中。數組

以前對python嵌入方式作過一番搜索,發現pythonQt應該算是一個比較好的方法,可使本身更專一到本身應用的開發中。app

下載: 能夠從pythonqt.sourceforge.net中下載[http://sourceforge.net/p/pythonqt/wiki/Home/測試

編譯:按照其文檔對其進行編譯,須要注意的是,在不一樣的平臺上須要修改相對應的python.prf中的python版本,另外,對於Mac而言, 還須要特別注意一下其版本的路徑,這一點我一開始在本身的ibook上沒有留意,後來發現編譯到一半的時候提示出錯,細查之下才留意到,系統中安裝的 python版本是2.3,本身安裝及配置的版本是2.6,而在python.prf中配置的默認路徑指向的是2.3中的路徑,修改爲2.6相應的路徑後 再編譯便可經過。ui

測試:在編譯的時候會生成示例的可執行文件,可是多是路徑方面的緣由,未能運行。想一想後面集成進工程中仍是須要寫配置文件,所以,本身寫了一個cmake文件,測試的同時也便於之後本身參考:spa

project(PythonQtTest)  
cmake_minimum_required(VERSION 2.6)  
find_package(Qt4 REQUIRED)  
include(${QT_USE_FILE})  
find_package(PythonLibs REQUIRED)  
if(PYTHONLIBS_FOUND)  
  include_directories(${PYTHON_INCLUDE_PATH})  
else(PYTHONLIBS_FOUND)  
message("could not find PythonLibs")  
endif(PYTHONLIBS_FOUND)  
#  
qt4_wrap_cpp(PyExampleObject_MOC PyExampleObject.h)  
qt4_add_resources(PyScriptingConsole_RCS_SOURCES PyScriptingConsole.qrc)  
#PythonQt related  
include_directories(/usr/local/include/PythonQt)  
link_directories(/usr/local/lib)  
set(APP_HEADERS  
  PyExampleObject.h  
  )  
set(APP_SOURCES  
    PyExampleObject.cpp  
    main.cpp  
    ${PyScriptingConsole_RCS_SOURCES}  
    )  
set(PYTHONQT_LIBRARIES PythonQt PythonQtGui)  
add_executable(test ${APP_SOURCES} ${APP_HEADERS} ${PyExampleObject_MOC})  
target_link_libraries(test ${PYTHONQT_LIBRARIES} ${QT_LIBRARIES} ${PYTHON_LIBRARIES})

排錯:
.net

用cmake編譯成功後,可是運行時導入一些庫並未成功,如 import numpy,可是一些經常使用的import sys則能夠用。一開始覺得是PythonQt僅支持Python內置的modules,而不支持外部的modules,差點放棄使用,準備本身用 Python C/API來寫一個簡單地本身用了。 可是,本身在系統的python中則能夠自行導入任意的modules,想一想有多是環境變量的緣由,而後打印出環境變量查看,並查看對應目錄,發如今該 目錄下的模塊都可導入,並不是只能導入部分模塊。code

所以,在PythonQt的ScriptConsole的例子中用print sys.path與系統的python比較,發現確實不一致。blog

經過搜索,修改環境變量的方法參考以下:http://blog.csdn.net/likelynn/archive/2007/09/28/1804665.aspx

在測試的時候先用第三種手動append環境變量的方法先測試,發現可行。在此處須要注意,把當前目錄(‘ ’)也須要加進去,要否則會出些小錯誤。

經過這樣排錯以後,整個pythonQt的ScriptConsole例子則基本上與系統的python console相似了,後續要作的則是在要使用的時候將其集成到Qt application之中。

數據如何在主程序及Python之間進行交互?

嵌入Python console的最終目的是但願在主程序及Python之間進行數據的傳遞與處理。

Python與主程序之間數據的傳遞包含兩種狀況,一種是主程序中將C++ 類中的數據傳送給Python供處理,關於使用的例子能夠參見pythonqt源代碼中的PyCPPWrapExample,其中包含了兩種封裝CPP對 象的方式。一種是使用decorators的方式來封裝,一種是使用wrap factory的方式來封裝。 另外一種狀況是將Python中處理過的數據回傳給C++程序做進一步處理,在pythonqt中是經過PythonQtObjPtr中的 getVariable等經過QVariant來獲得python回傳給Qt,而後經過類型轉換獲得。 如今還有一點沒有嘗試的是,如何回傳多個值或一個數組,以前記得在numpy中看到過這部分的資料,有須要的時候再查一下了。

相關文章
相關標籤/搜索