可运行于IOS的Python解释器

    本文一个运行于iphonepython解释器的例子,版本为python2.7,由于主要是为了说明如何初始化python解释器,运行python脚本,例子中的界面比较简单,一个输入栏用于输入python脚,一个输出栏用于显示运行的结果。Iphone支持Object-CC++代码混合编译,可以直接使用C++代码进行开发。

    这里Python解释器基于cle开发,首先需要初始化cle,然后加载和初始化python解释器,最后是获取输入的脚本并捕获输出结果。

1.创建工程

    创建一个iphoneSingleView工程,添加需要的库文件:sqlite3,iconv,starpy,python2.7,starcore

        设置工程参数,宏定义,头文件和库文件的搜索路径

    添加python扩展库文件,已经打包成一个压缩文件,可以根据需要裁剪。

2.初始化CLEpython

    例子基于CLE开发,首先需要初始化CLE,为了不影响界面刷新,使用独立的线程进行初始化,CLE运行于初始化的线程中。但是从界面线程或者其它线程中调用CLE相关的函数,或者执行python脚本,需要进行加锁操作,此外该线程需要维护CLE的消息循环。

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


3.捕获python脚本的输出

   为了捕获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);

4. 执行python脚本


4.1 编译不执行

    可以只编译脚本,不执行,此时检查脚本中的语法错误。编译脚本需要调用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();


4.2 直接执行脚本


    调用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 ),下载之后解压,与例子放在统一目录,如下:

例子下载






  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值