私はrpy2を使って概念証明して、既存のRパッケージをWebサービスに結びつけています。この問題を解決するには、パッケージのソースがあります。私は現在Windows上で開発中ですが、Linuxを使用することでこの問題が解決されれば、それは私の計画された環境なので、うまくいきます。grDevicesファイルを開く
このPOCの最初のポイントは、このパッケージで作成したチャートをキャプチャし、Flaskを使用してWebリクエストまで提供しようとしています。完全なコード:TempDirectory()
をクリーンアップするために行くとき
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'
を取得し、それが起こります。 Flaskデバッガを使用すると、png
変数も空です。
したがって、どうすればgrDevices
をファイルにすることができますか?それとも私のPOCについて別の方法で行く必要がありますか?
全体の "ないデータ・サイエンス・スタッフ" のコンテキストマネージャブロックの外側に
return Response(png, "image/png")
を移動してみてくださいブロックは最終的に 'plot()'、 'text()'、 'polygon()'およびotを呼び出す関数を呼び出します彼女たち。 Windows上で実行すると、グラフィックスウィンドウがポップアップします。私はLinuxのVMとしてこれを設定するように取り組んでいます。 Xvfbへのエクスカーションにつながっている。 –残念ながら、私は現在、これを試すWindows版を持っていません。 Windowsがポップアップしているのが不思議です。それ以外の場合、LinuxではR PNGグラフィックをプロットするためにX11/xorgは必要ありません。問題を複製しようとするための自己完結型の例がなくても、より多くのことを支援することは困難です。 – lgautier
私は今、linuxの下でアプリケーションを実行しており、それは完全に動作します。だから私はそれがファイルを共有するWindowsの動作posixとちょうど何かだと思います。 –