【问题标题】:grDevices holding file opengrDevices 保持文件打开
【发布时间】:2016-07-15 04:13:51
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: python python-3.x rpy2


    【解决方案1】:

    rpy2 在 Windows 上不受完全支持,在 Linux(或 OS X)上运行的可能不完全支持。由于您正在使用 Flask 开发 PoC,我鼓励您尝试使用 Docker(在 Windows 上使用 docker-machine)。你可以使用 rpy2 的 docker 镜像作为基础镜像。

    但是,这里只是使用 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 的上下文管理器块之外

    【讨论】:

    • 整个“做数据科学的东西”块调用一个函数,该函数最终调用plot()text()polygon() 等。在 Windows 上运行,我确实会弹出图形窗口。我正在为此设置 linux vm。这将导致进入 Xvfb。
    • 不幸的是,我目前没有 Windows 版本可以试用。奇怪的是弹出一个窗口。否则,在 Linux 上,您不需要 X11/xorg 来绘制 R PNG 图形。如果没有一个独立的示例来尝试复制问题,很难提供更多帮助。
    • 我现在在 linux 下运行该应用程序,它运行良好。所以我想这只是 Windows 与 posix 共享文件的行为。
    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 2011-10-14
    • 2011-04-24
    • 2013-07-31
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多