web|分析 调flask服务接口执行r脚本做python-r参数转换报Conversion 'py2rpy' not defined for objects of type '<class...
背景
基于flask的python web服务提供了一个生成统计报告数据的restful接口,该接口核心方法—— 统计方法 的特点是会调用r脚本进行计算,期间涉及python到r的入参、r执行结果到python的出参的转换
特征描述
在通过 main方法 执行 统计方法 时,可以正常运行不报错,但是通过 网络调用 (不管内网外网)接口来执行 统计方法 时就会报参数转换错误
...
Conversion 'py2rpy' not defined for objects of type '<class 'pandas.core.frame.DataFrame'>'
Conversion 'rpy2py' not defined for objects of type '<class 'rpy2.rinterface.SexpClosure'>'
分析(找到隐含信息)
基于控制变量法,两种不同调用方式最大的差异就是main方法调用是运行在主线程,而flask的网络调用是非阻塞异步调用,运行在子线程。
假设1通过xx方式获得的python-r对象转换器,无法在子线程运行
import pandas as pd
from rpy2.robjects import pandas2ri
dataFrame = pd.DataFrame(data)
dataFrameR = pandas2ri.py2rpy(dataFrame)
robjects.globalenv['dataFrameR'] = dataFrameR
robjects.r(r_script)
解决思路(决策)
基于分析的假设,寻找可以创建线程本地执行器对象的方法、
解决方法(决策的实施结果)
使用创建线程本地执行器对象的方法
import pandas as pd
from rpy2.robjects import conversion, default_converter, pandas2ri
from rpy2.robjects.conversion import localconverter
pandas2ri.activate()
dataFrame = pd.DataFrame(data)