grDevices保持文件打开

时间:2016-07-15 04:13:52

标签: python python-3.x rpy2

我正在研究使用rpy2将现有R包绑定到Web服务的概念验证。如果需要解决此问题,我确实有源包。我目前也正在开发Windows,但如果使用Linux解决了这个问题,那很好,因为那是我的计划环境。

对于我在此POC中的第一点,我正在尝试捕获此程序包生成的图表,并使用Flask将其提供给Web请求。完整的代码:

from flask import Flask, Response
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
from tempfile import TemporaryDirectory
from os import path

app = Flask(__name__)

null = ro.r("NULL")
numeric = ro.r("numeric")
grdevices = importr("grDevices")
efm = importr('euroformix')

@app.route('/')
def index():    
    table = efm.tableReader('stain.txt')
    list = efm.sample_tableToList(table)

    with TemporaryDirectory() as dir_name:
        print("Working in {0}".format(dir_name))
        png_path = path.join(dir_name, "epg_mix.png")
        print("png path {0}".format(png_path))
        grdevices.png(file=png_path, width=512, height=512)
        # Do Data Science Stuff Here
        grdevices.dev_off()

        with open(png_path, 'rb') as f:
            png = f.read()
            return Response(png, "image/png")

if __name__ == '__main__':
    app.run(debug=True)

点击服务时,我会回来PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\matt\\AppData\\Local\\Temp\\tmpgg65cagq\\epg_mix.png'

查看调用堆栈,它会在TempDirectory()清理时发生。使用Flask调试器,png变量也是空的。

那么,如何让grDevices关闭文件?或者我是否需要以不同的方式进行我的POC?

1 个答案:

答案 0 :(得分:1)

Windows上不完全支持

rpy2,而Linux(或OS X)上的工作可能不会。由于您正在使用Flask开发PoC,我建议您尝试使用Docker(在Windows上使用docker-machine)。您可以使用rpy2的泊坞窗图像作为基本图像。

但是,这只是使用R函数png()dev.off()所以它“应该”有效。

我有3条建议:

1 -

你的“做数据科学的东西”会阻止任何R情节吗?如果没有,这将解释为什么你的Python对象png为空。

2-

如果使用R的grid系统(例如,通过latticeggplot2)并且您正在将字符串作为R代码进行评估,则最好明确要求R绘制图形。例如:

p <- ggplot(mydata) + geom_point(aes(x=x, y=y))
print(p)

而不是

ggplot(mydata) + geom_point(aes(x=x, y=y))

3 -

尝试将return Response(png, "image/png")移至TemporaryDirectory

的上下文管理器块之外