我正在研究使用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的行爲。 –