美文网首页OC开发iOS DeveloperiOS开发
iOS 工程中调用Python方法

iOS 工程中调用Python方法

作者: 改变自己_now | 来源:发表于2017-09-14 18:14 被阅读2073次

    由于公司开发的产品需要在原生app中调用Python去抓取数据,于是在网上找了很久资料,发现还是比较少的。发现比较有用的如下:
    使用Python开发iOS程序
    Python官网
    第一篇文章让我找了思路,具体原理就是在App中安装Python解释器,还好有大牛在下面是编译解释的脚本地址。
    https://github.com/pybee/Python-iOS-support
    也可以去下载编译好的版本,我是懒人一个就去下载编译好的,下面为下载地址
    https://github.com/pybee/Python-iOS-support/releases

    52EB8D50-7925-4EA7-AB8D-A1337AECB0E5.png
    下载下来解压为OpenSSL.frameworkPython.framework将其拖入Xcode工程中,另外将PythonEnvironment.bundle资源包也拖入工程中
    一、如何在Xcode中执行Python方法
    1、首先设置Python的Home路径
      Py_SetPythonHome(pythonHome);
    
    
    942EA94D-F387-471A-BE5A-2B55730A2AB9.png
    注意pythonHome的路径为PythonEnvironment.bundle中的Resources路径

    2、初始化解释器并执行简单的python语句

     Py_Initialize();
     PyRun_SimpleString("print('hello world')");
    
    

    3、释放解释器

     Py_Finalize();
    

    上面简单的步骤就能调用Python方法了。
    二、如何调用.py中类的实例方法
    1、首先将.py文件剪切到xxxx/PythonEnvironment.bundle/Python.framework/Resources/lib/python3.4/site-packages
    注意这个路径需要导入这个PythonEnvironment.bundle中。
    2、设置路径和初始化解释器,导入模块找到类并实例化。

      PyObject * pModule =PyImport_ImportModule(fileName);//导入模块
      PyObject *pyClass = PyObject_GetAttrString(pModule, [className UTF8String]); //获取类
      PyObject *pyInstance = PyInstanceMethod_New(pyClass); //创建实例
    

    3、执行方法

        PyObject *result = NULL;
        result = PyObject_CallMethod(pyInstance, [methodName UTF8String], "(N,s)",pyClass,[paramterJsonString UTF8String]);
      // 解析数据
        char * resultCString = NULL;
        PyArg_Parse(result, "s", &resultCString); //将python类型的返回值转换为c
    

    上面PyObject_CallMethod中第一个参数为实例对象,第二参数为方法名,第三个格式化参数,PyArg_Parse方便是把方法的结果转为c语音字符串。

    总结:

    其实在iOS中调用Python不是很难,主要是一开始的时候不知道如何设置Home路径,还是就是需要将.py文件剪切到相对应得路径中去,要不使用PyImport_ImportModule方法一直导入不了module。最后放上对其封装和测试的Demo地址。注意OpenSSL.frameworkPython.framework太大我就没上传了,下载下来直接运行不了。

    相关文章

      网友评论

      • 风在等我来:你好,请问一下设置Home路径,,找了很久都没找到,请楼主帮忙
      • 洛小魇:楼主大大。我遇到了一个新的问题。这个坑我又研究了一周了。希望大大可以指点一下。是这样的。如果我用pyCharm写了一段python代码。他引入了一些类似于什么lxml之类的三方框架。在pycharm上我的代码是可以运行的。但是在ios中我调用这段代码,就会报错。说找不到这个lxml框架。
        我是直接将我机器中python路劲下的site-packages直接拷到xcode项目的那个你说的路径中。可是运行不了。希望楼主可以指点一下。谢谢了:yum:
      • 洛小魇:难道我下载的demo和你们的不一样吗。我导入了同样版本的OpenSSL.framework和Python.framework运行了代码。就两个非常简单的界面,根本和python代码无关。仔细阅读代码之后发现他好像并没有调用那段设置python Home的代码。然后我单独把这段设置home的代码放到delegate中就会报错:“Fatal Python error: Py_Initialize: unable to load the file system codec
        ImportError: No module named 'encodings'”
        原因是说python Home的路径不对。
        大家有没有能跑的demo可以借我学习一下么。这个代码研究了块1周了,发现自己解决不了。
        洛小魇:@改变自己_now 是这样的,我多次测试发现,有时候能成功,有时候不能成功。不知道是不是我下载的那个framework有问题。我就重新下载了一遍。再倒入那些framework就好了
        改变自己_now:@洛小魇 还没调通?
        洛小魇:谢谢楼主大大的思路提供和分享:smile:
      • mason_sun:请问一下,Demo中的PythonEnvironment.bundle资源是怎么来的呢?
      • 余兴民:请问一下,Demo中的PythonEnvironment.bundle资源是怎么来的呢?
      • iLeooooo:请问一下,Demo中的PythonEnvironment.bundle资源是怎么来的呢?
      • 小胡子杰克:你好,感谢你的分享。已经能够正常地运行自己的项目,但是有个不清楚的点想请教下。
        PythonEnvironment.bundle这个资源是自己声称的吗,里面的Python.framework大小只有10几M是哪里来的呢?
        另外关于类似PyObject_CallMethod这些宏有没有相关的文档呢,找了一圈都没有找到,不知道你当初写的时候是参照什么文档写的,希望分享下过程,谢谢。
        改变自己_now:@小胡子杰克 python官方文档,
        小胡子杰克:10几兆的Python.framework是否是Python解释器编译前的源码,下载的Python.framework中的Resources文件夹内容。这样的话是否可以之前指定Home路径为Python.framework中的Resources文件目录,不需要复制到沙盒中才能使用呢?
      • b3187d6752f8:大哥。必须得求教你了,。。我已经研究了一个星期了。。导入三方模块,总出错。时而是好的。时而是坏的。我摸不着报错的一点头绪,。
      • 7f5f8b01f286:Implicit declaration of function '_Py_char2wchar' is invalid in C99 我下载了demo后出现了这个报错
        7f5f8b01f286:@改变自己_now 我把需要的库下载拖进来了
        改变自己_now:@chileZZZ 需要库你下载拖到项目里没有?demo中没有的
      • 小子爱搞事:请教一下,我在你的 Pybridge.py 文件中添加如下代码(注释部分的内容):
        import json
        import importlib
        import traceback
        import time
        import importlib.util

        #import socks
        #import socket

        #from apiclient.discovery import build
        #from oauth2client.service_account import ServiceAccountCredentials

        就提示:====error = 导入module出错,请重试

        python文件中有什么需要注意的吗?有没有文档可以参考的
        改变自己_now:@小子爱搞事 按道理没影响
        小子爱搞事:@改变自己_now 我把安装的第三款库都copy进去了,#import socks 通过了,但是最后两个还是不能通过。我mac上的python是3.6版本的,这个没有影响吧
        改变自己_now:如果不是python自带的库都是需要copy到这么目录的xxxx/PythonEnvironment.bundle/Python.framework/Resources/lib/python3.4/site-packages,不知道能帮到你
      • jooooker:请问下博主,这个怎么执行后台返回的Python代码呢?
        改变自己_now:@jooooker 把后台的代码下载到本地就可以执行了吧

      本文标题:iOS 工程中调用Python方法

      本文链接:https://www.haomeiwen.com/subject/jxidsxtx.html