由于公司开发的产品需要在原生app中调用Python去抓取数据,于是在网上找了很久资料,发现还是比较少的。发现比较有用的如下:
使用Python开发iOS程序
Python官网
第一篇文章让我找了思路,具体原理就是在App中安装Python解释器,还好有大牛在下面是编译解释的脚本地址。
https://github.com/pybee/Python-iOS-support
也可以去下载编译好的版本,我是懒人一个就去下载编译好的,下面为下载地址
https://github.com/pybee/Python-iOS-support/releases
下载下来解压为
OpenSSL.framework
和Python.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.framework
和Python.framework
太大我就没上传了,下载下来直接运行不了。
网友评论
我是直接将我机器中python路劲下的site-packages直接拷到xcode项目的那个你说的路径中。可是运行不了。希望楼主可以指点一下。谢谢了
ImportError: No module named 'encodings'”
原因是说python Home的路径不对。
大家有没有能跑的demo可以借我学习一下么。这个代码研究了块1周了,发现自己解决不了。
PythonEnvironment.bundle这个资源是自己声称的吗,里面的Python.framework大小只有10几M是哪里来的呢?
另外关于类似PyObject_CallMethod这些宏有没有相关的文档呢,找了一圈都没有找到,不知道你当初写的时候是参照什么文档写的,希望分享下过程,谢谢。
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文件中有什么需要注意的吗?有没有文档可以参考的