我正在研究使用rpy2将现有R包绑定到Web服务的概念验证。如果需要解决此问题,我确实有源代码包。我目前也在Windows上开发,但如果通过使用Linux来解决此问题,那很好,因为这是我的计划环境。grDevices保存文件open
对于我在这个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?
整个 “数据做科学的东西”块调用一个最终调用'plot()','text()','polygon()'和ot的函数她的。在Windows上运行,我确实会弹出图形窗口。我正在努力让linux vm为此设置。这导致了Xvfb的游览。 –
不幸的是,我目前没有Windows版本来尝试这个。奇怪的是一个Windows弹出。否则,在Linux上,您不需要X11/xorg来绘制R PNG图形。如果没有独立的示例来尝试尝试复制问题,很难帮助更多人。 – lgautier
我现在正在linux下运行这个应用程序,它完美的工作。所以我想这只是Windows共享文件vs posix的行为。 –