iOS 工程中调用Python方法

由于公司开发的产品需要在原生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太大我就没上传了,下载下来直接运行不了。

推荐阅读更多精彩内容