2016-03-21 16 views
1

Okay, ich habe also eine einfache Schnittstelle, die ich mit dem Django-Framework entworfen habe, das natürliche Spracheingabe von einem Benutzer nimmt und in Tabelle speichert.Verwenden von Java-Code im Django-Framework

Zusätzlich habe ich eine Pipeline, die ich mit Java unter Verwendung der cTAKES-Bibliothek erstellt habe, um die Erkennung von benannten Entitäten durchzuführen, d. H. Sie nimmt die vom Benutzer übermittelte Texteingabe und kennzeichnet sie mit relevanten UMLS-Tags.

Was ich tun möchte, ist die Eingabe von dem Benutzer gegeben, dann einmal, seine eingereicht, direkt in meine Java-CTAKES-Pipeline dann füttern die kommentierte Ausgabe zurück in die Datenbank.

Ich bin ziemlich neu in der Web-Entwicklung Seite von diesem und kann wirklich nichts über die Integration von Skripten in diesem Sinne finden. Wenn also jemand mich auf eine nützliche Ressource oder einfach in die richtige Richtung verweisen könnte, wäre das sehr hilfreich.

========================= UPDATE:

Okay, so habe ich herausgefunden, dass das subprocess das Modul ist, dass ich möchte in diesem Zusammenhang verwenden, und ich habe versucht, die Dokumentation einige einfache Code Implementierung basiert auf, aber ich bin ein

Exception Type: OSError 
Exception Value: [Errno 2] No such file or directory 
Exception Location: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py in _execute_child, line 1335. 

Ein kurzer Überblick bekommen, was ich versuche zu tun:

Dies ist Code habe ich in Ansichten. Seine Absicht ist, eine Texteingabe von dem Modellformular zu machen, POST das zu der DB und dann diese Eingabe in mein Skript, das eine XML-Datei erzeugt, die in einer anderen Spalte in der DB gespeichert ist. Ich bin sehr neu in Django, also tut es mir leid, wenn das eine einfache Lösung ist, aber ich konnte keine Dokumentation finden, die Django mit dem Unterprozess in Verbindung bringt, was hilfreich war.

def queries_create(request): 
    if not request.user.is_authenticated(): 
     return render(request, 'login_error.html') 


    form = QueryForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     p=subprocess.Popen([request.POST['post'], './path/to/run_pipeline.sh']) 
     p.save() 

    context = { 

     "title":"Create", 
     "form": form, 

    } 
    return render(request, "query_form.html", context) 

Modell Code-Schnipsel:

class Query(models.Model): 
    problem/intervention = models.TextField() 

    updated = models.DateTimeField(auto_now=True, auto_now_add=False) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

UPDATE 2: Okay, so wird der Code nicht durch mehr bricht den subprocess Code wie unten

def queries_create(request): 
    if not request.user.is_authenticated(): 
     return render(request, 'login_error.html') 


    form = QueryForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     p = subprocess.Popen(['path/to/run_pipeline.sh'], stdin=subprocess.PIPE,  
     stdout=subprocess.PIPE) 
     (stdoutdata, stderrdata) = p.communicate() 
     instance.processed_data = stdoutdata 
     instance.save() 

    context = { 

     "title":"Create", 
     "form": form, 

    } 
    return render(request, "query_form.html", context) 

jedoch ändern, ich bin jetzt immer a "Konnte Hauptklasse pipeline.CtakesPipeline nicht finden oder laden", die ich nicht verstehe, da das Skript von der Shell in diesem Arbeitsverzeichnis einwandfrei ausgeführt wird. Dies ist das Skript, das ich mit Subprozess aufrufen möchte.

#!/bin/bash 

INPUT=$1 
OUTPUT=$2 
CTAKES_HOME="full/path/to/CtakesClinicalPipeline/apache-ctakes-3.2.2" 
UMLS_USER="####" 
UMLS_PASS="####" 
CLINICAL_PIPELINE_JAR="full/path/to/CtakesClinicalPipeline/target/ 
CtakesClinicalPipeline-0.0.1-SNAPSHOT.jar" 

[[ $CTAKES_HOME == "" ]] && CTAKES_HOME=/usr/local/apache-ctakes-3.2.2 

CTAKES_JARS="" 
for jar in $(find ${CTAKES_HOME}/lib -iname "*.jar" -type f) 
do 
    CTAKES_JARS+=$jar 
    CTAKES_JARS+=":" 
done 

current_dir=$PWD 
cd $CTAKES_HOME 

java -Dctakes.umlsuser=${UMLS_USER} -Dctakes.umlspw=${UMLS_PASS} -cp  
${CTAKES_HOME}/desc/:${CTAKES_HOME}/resources/:${CTAKES_JARS%?}: 
${current_dir}/${CLINICAL_PIPELINE_JAR} -  
-Dlog4j.configuration=file:${CTAKES_HOME}/config/log4j.xml -Xms512M -Xmx3g 
pipeline.CtakesPipeline $INPUT $OUTPUT 

cd $current_dir 

Ich bin mir nicht sicher, wie man diesen Fehler beheben kann, damit jede Hilfe geschätzt wird.

+1

Ich bin überhaupt nicht mit cTAKES vertraut, also entschuldige ich mich, wenn dies eine ignorante Frage ist: Führen Sie diesen Java-Dienst bereits auf einer vorhandenen Maschine aus und möchten Daten von Ihrer Web-App dorthin leiten, oder suchen Sie Bereitstellen der Web-App und der Java-App? – souldeux

+1

Ich möchte die Pipeline als Teil der Web-App bereitstellen. Ich möchte das Java-Skript intern verwenden. – jdv12

Antwort

2

Wenn ich Sie richtig verstehe, möchten Sie den Wert von request.POST ['post'] an das Programm run_pipeline.sh leiten und die Ausgabe in einem Feld Ihrer Instanz speichern.

  1. Sie rufen subprocess.Popen falsch auf.Es sollte sein:

    p = subprocess.Popen(['/path/to/run_pipeline.sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

  2. Dann im Eingang passieren und die Ausgabe

    (stdoutdata, stderrdata) = p.communicate()

  3. Dann speichern Sie die Daten lesen, z.B. in einem Feld von Ihrer Instanz

    instance.processed_data = stdoutdata instance.save()

Ich schlage vor, Sie zum ersten Mal in einem Python-Shell arbeiten den Anruf an die subprocess zu erhalten und integrieren sie dann in Ihren Django app sicher.

Bitte beachten Sie, dass das Erstellen eines (potenziell lang laufenden) Subprozesses in einer Anfrage sehr schlecht ist und zu vielen Problemen führen kann. Die beste Vorgehensweise besteht darin, lange laufende Aufgaben in einer Jobwarteschlange zu delegieren. Für Django wird Celery wahrscheinlich am häufigsten verwendet. Es ist ein wenig Setup beteiligt.

+1

Hey danke für die Hilfe! Ich versuche, das jetzt zu funktionieren und es funktioniert viel besser. Der Code, den ich versuche, durch das Bash-Skript zu laufen, ist jedoch Java, und ich erhalte den Fehler "Hauptklasse nicht finden oder laden". Hat das etwas mit den Subprozessparametern zu tun? – jdv12

+1

Das klingt wie ein Problem mit Ihrem Klassenpfad. Können Sie den genauen Befehl ausführen, den Sie verwenden, um das Skript in demselben Arbeitsverzeichnis aufzurufen, in dem Sie das Python-Skript ausführen? –

+1

Ja, ich habe es gerade versucht und es funktioniert gut. Es ist nur, wenn ich versuche, es durch die Django-Anwendung auszuführen, dass es die Hauptklasse nicht finden kann. – jdv12

Verwandte Themen