2016-07-15 19 views
1

Ich arbeite an einem Proof of Concept mit rpy2, um ein bestehendes R-Paket an einen Webdienst zu binden. Ich habe die Quelle für das Paket, wenn dies zur Behebung dieses Problems erforderlich ist. Ich entwickle gerade auch unter Windows, aber wenn dieses Problem durch die Verwendung von Linux gelöst wird, ist das in Ordnung, da dies meine geplante Umgebung ist.grDevices hält Datei geöffnet

Für meinen ersten Punkt in diesem POC, versuche ich ein Diagramm von diesem Paket zu erfassen, und es zu einer Web-Anfrage mit Flask. Der vollständige Code:

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) 

Wenn der Service schlagen, komme ich zurück 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'

bei den Call-Stack Sehen, es geschieht, wenn TempDirectory() aufzuräumen geht. Mit dem Flask-Debugger ist die Variable png ebenfalls leer.

Also, wie mache ich grDevices schließen Sie die Datei? Oder muss ich meinen POC anders machen?

Antwort

1

rpy2 wird nicht vollständig unter Windows unterstützt und was unter Linux (oder OS X) funktioniert möglicherweise nicht. Da Sie ein PoC mit Flask entwickeln, sollten Sie Docker (mit docker-machine unter Windows) ausprobieren. Sie können das Docker-Bild von rpy2 als Basisbild verwenden.

Hier werden jedoch nur die R-Funktionen png() und dev.off() verwendet, damit es "funktionieren sollte".

Ich habe 3 Vorschläge:


1-

Gibt es in Ihrem "Do Daten Wissenschaft stuff" Block jede R Plot machen? Wenn nicht, würde dies erklären, warum Ihr Python-Objekt png leer ist.


2-

Wenn grid System unter Verwendung von R (zum Beispiel durch lattice oder ggplot2) und Sie Strings als R-Code evaluieren ist es vorzuziehen, R explizit zu bitten, die Figur zu zeichnen. Zum Beispiel:

p <- ggplot(mydata) + geom_point(aes(x=x, y=y)) 
print(p) 

statt

ggplot(mydata) + geom_point(aes(x=x, y=y)) 

3-

Versuchen return Response(png, "image/png") außerhalb des Kontext-Manager Block für TemporaryDirectory

+0

die ganze "Do Daten Wissenschaft Stuff" moving block ruft eine Funktion auf, die schließlich 'plot()', 'text()', 'polygon()' und ot aufruft ihres. Unter Windows laufen die Grafikfenster auf. Ich arbeite daran, wie linux vm dafür eingerichtet wird. was zu einem Ausflug nach Xvfb führt. –

+0

Leider habe ich derzeit keine Windows-Version, um dies zu versuchen. Seltsam, dass ein Windows auftaucht. Andernfalls sollten Sie unter Linux X11/xorg nicht benötigen, um R PNG-Grafiken zu plotten. Es ist schwierig, mehr zu helfen, ohne ein eigenständiges Beispiel zu versuchen, das Problem zu replizieren. – lgautier

+0

Ich leite jetzt die App unter Linux, und es funktioniert perfekt. Ich denke, es ist nur etwas mit dem Verhalten von Windows, Dateien gegen Posix zu teilen. –