本文一個運行於iphone的python解釋器的例子,版本為python2.7,由於主要是為了說明如何初始化python解釋器,運行python腳本,例子中的界面比較簡單,一個輸入欄用於輸入python腳,一個輸出欄用於顯示運行的結果。Iphone支持Object-C和C++代碼混合編譯,可以直接使用C++代碼進行開發。
這裡Python解釋器基於cle開發,首先需要初始化cle,然後加載和初始化python解釋器,最後是獲取輸入的腳本並捕獲輸出結果。
1.創建工程創建一個iphone的SingleView工程,添加需要的庫文件:SQLite3,iconv,starpy,python2.7,starcore
StarCoreBackgroundWorker* myworker = [StarCoreBackgroundWorker initStarCoreBackgroundWorker]; [myworker RunAsync:^(id sender1, DoWorkEventArgs *e) { BackgroundWorker* worker = (BackgroundWorker*)sender1; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; const char* destDir = [documentsDirectory UTF8String]; StarCore_Init((VS_CHAR *)destDir); NSString *respaths = [[NSBundle mainBundle] resourcePath]; const VS_CHAR *res_cpath = [respaths UTF8String]; VS_CHAR python_path[512]; VS_CHAR python_home[512]; sprintf(python_home,"%s/python",res_cpath); sprintf(python_path,"%s/python2.7.zip",res_cpath); VSCoreLib_InitPython((VS_CHAR*)python_home,(VS_CHAR *)python_path,NULL); VS_CORESIMPLECONTEXT Context; SRPInterface = VSCoreLib_InitSimple(&Context,"test","123",0,0,MsgCallBack,0,NULL); BasicSRPInterface = SRPInterface->GetBasicInterface(); BasicSRPInterface->InitRaw("python", SRPInterface); void *python = SRPInterface ->ImportRawContext((VS_CHAR*)"python",(VS_CHAR*)"",false,NULL); //---enter msg loop SRPControl = BasicSRPInterface->GetSRPControlInterface(); while(true){ while(SRPControl->SRPDispatch(VS_FALSE) == VS_TRUE); [NSThread sleepForTimeInterval:0.01]; } } userState:nil ProgressChanged:^(id sender1, ProgressChangedEventArgs *e) { } RunWorkerCompleted:^(id sender1, RunWorkerCompletedEventArgs *e) { }];
StarCoreBackgroundWorker是為移植性封裝的IOS的線程,詳細介紹見http://blog.csdn.net/srplab1/article/details/58251894
為了捕獲python腳本的輸出結果,需要注冊CLE的回調函數,在回調函數中,將輸出結果顯示到文本框中。
回調函數:
static VS_UWORD MsgCallBack( VS_ULONG ServiceGroupID, VS_ULONG uMsg, VS_UWORD wParam, VS_UWORD lParam, VS_BOOL *IsProcessed, VS_UWORD Para ) { switch( uMsg ){ case MSG_VSDISPMSG : case MSG_VSDISPLuaMSG : printf("[core]%s\n",(VS_CHAR *)wParam); break; case MSG_DISPMSG : case MSG_DISPLuaMSG : //--display message in text box [Control showPythonResult:[NSString stringWithUTF8String:(VS_CHAR*)wParam]]; break; } return 0; }
在初始化CLE時,指定回調函數
VS_CORESIMPLECONTEXT Context; SRPInterface = VSCoreLib_InitSimple(&Context,"test","123",0,0,MsgCallBack,0,NULL);
可以只編譯腳本,不執行,此時檢查腳本中的語法錯誤。編譯腳本需要調用CLE的函數PreCompile。該函數返回bool值和錯誤信息,如果返回true,則成功編譯;如果返回false, 並且錯誤信息為空,表示輸入腳本不完整;否則錯誤信息中為返回的編譯錯誤。
SRPControl->SRPLock(); VS_CHAR *ErrorInfo; const VS_CHAR *str = [val UTF8String]; VS_BOOL Result = BasicSRPInterface->PreCompile("python", str, strlen(str), NULL, &ErrorInfo); if( Result == VS_TRUE ) self.textBlock1.text = @"success"; else{ if( ErrorInfo == NULL ) self.textBlock1.text = @"More Input"; else self.textBlock1.text = [NSString stringWithUTF8String:ErrorInfo]; } SRPControl->SRPUnLock();
調用CLE的函數_RunScript執行python腳本。腳本的輸出會被之前設置的回調函數捕獲,顯示到輸出窗口中。
SRPControl->SRPLock(); const VS_CHAR *str = [val UTF8String]; SRPInterface->DoBuffer("python", str, strlen(str), NULL, NULL, NULL, VS_TRUE); SRPControl->SRPUnLock();5. 結束語
本例子實現了一個可運行於iphone平台的python解釋器,代碼非常簡單。可以參考本文中的方法,在iphone應用中使用python腳本語言。編譯運行本文中的例子需要CLE(http://www.srplab.com/data/starcore_for_ios.2.5.1.tar.gz),下載之後解壓,與例子放在統一目錄,如下:
以上就是可運行於IOS的Python解釋器的全文介紹,希望對您學習和使用ios應用開發有所幫助.
【可運行於IOS的Python解釋器】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!