grDevices 保持文件打开
grDevices holding file open
我正在研究使用 rpy2 将现有 R 包绑定到 Web 服务的概念证明。如果需要解决此问题,我确实有包的来源。我目前也在 Windows 上开发,但是如果这个问题通过使用 Linux 来解决,那很好,因为那是我计划的环境。
对于我在这个 POC 中的第一点,我试图捕获一个由这个包制作的图表,并使用 Flask 将它提供给网络请求。完整代码:
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?
rpy2
在 Windows 上不完全支持,而在 Linux(或 OS X)上工作的可能不支持。由于您正在使用 Flask 开发 PoC,我鼓励您尝试使用 Docker(在 Windows 上使用 docker-machine
)。您可以使用 rpy2 的 docker 图像作为基础图像。
然而,这里只是使用 R 函数 png()
和 dev.off()
所以它 "should" 工作。
我有3条建议:
1-
你的 "Do Data Science stuff" 积木有 R 图吗?如果不是,这将解释为什么你的 Python 对象 png
是空的。
2-
如果使用 R 的 grid
系统(例如,通过 lattice
或 ggplot2
)并且您正在评估字符串作为 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
的上下文管理器块之外
我正在研究使用 rpy2 将现有 R 包绑定到 Web 服务的概念证明。如果需要解决此问题,我确实有包的来源。我目前也在 Windows 上开发,但是如果这个问题通过使用 Linux 来解决,那很好,因为那是我计划的环境。
对于我在这个 POC 中的第一点,我试图捕获一个由这个包制作的图表,并使用 Flask 将它提供给网络请求。完整代码:
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?
rpy2
在 Windows 上不完全支持,而在 Linux(或 OS X)上工作的可能不支持。由于您正在使用 Flask 开发 PoC,我鼓励您尝试使用 Docker(在 Windows 上使用 docker-machine
)。您可以使用 rpy2 的 docker 图像作为基础图像。
然而,这里只是使用 R 函数 png()
和 dev.off()
所以它 "should" 工作。
我有3条建议:
1-
你的 "Do Data Science stuff" 积木有 R 图吗?如果不是,这将解释为什么你的 Python 对象 png
是空的。
2-
如果使用 R 的 grid
系统(例如,通过 lattice
或 ggplot2
)并且您正在评估字符串作为 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