【发布时间】: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