2016-03-21 81 views
1

好使用Java代码,所以我有一个简单的界面,我设计了Django框架是需要从表中的用户,并将其存储自然语言输入。在Django框架

另外我有一个管道,我使用Java的cTAKES库做命名实体识别,即它需要提交用户输入的文本和相关UMLS标签标注它建立。

我想要做的是采取从用户给定的输入,然后一次,它的提出,直接到我的java-cTAKES管道再喂注释输出反馈到数据库中。

我非常新的这个网络发展方面,并不能真正找到在这个意义上集成脚本什么。所以,如果有人能指点我一个有用的资源,或者只是在一般正确的方向,这将是非常有益的。

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

好了,所以我也想通了,子进程是模块我想在这种情况下使用,我曾尝试实施基于对文档的一些简单的代码,但我得到的

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. 

的什么,我试图做一个简要概述:

这是代码我有看法。它的目的是从模型表单获取文本输入,并将其发送到数据库,然后将该输入传递到我的脚本中,该脚本生成一个存储在数据库中另一列的XML文件。我很新的Django的,所以我很抱歉,如果这是一个简单的解决方法,但我找不到关于Django的给子过程,这是有帮助的任何文件。

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) 

型号代码片段:

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) 

更新2: 好了,代码不再通过改变子代码如下

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) 

但是打破,我现在越来越一个“无法找到或加载主类pipeline.CtakesPipeline”,我不明白,因为脚本在这个工作目录下运行良好。这是我想用子进程调用的脚本。

#!/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 

我不知道如何去解决这个错误,所以任何帮助表示赞赏。

+1

我完全不熟悉cTAKES,所以如果这是一个无知的问题,我很抱歉:您是否已经在现有机器上运行此Java服务,并正在从您的web应用程序向其传输数据,或者您是否希望部署Web应用程序和Java应用程序? – souldeux

+1

我期待将管道部署为Web应用程序的一部分。我想在内部使用java脚本。 – jdv12

回答

2

如果我理解正确的话,你要管request.POST [“后”]到程序run_pipeline.sh的价值,并输出存储在您的实例的字段。

  1. 您正在调用subprocess.Popen不正确。它应该是:

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

  2. 然后通过在输入和读出的输出

    (stdoutdata, stderrdata) = p.communicate()

  3. 然后保存数据,例如在您的实例

    instance.processed_data = stdoutdata instance.save()

的领域,我建议你首先要确保拿到调用子在Python壳工作,然后在你的Django应用程序集成。

请注意,在请求中创建(可能是长期运行的)子进程是非常糟糕的做法,可能会导致很多问题。最佳做法是将长时间运行的任务委托给作业队列。对于Django,Celery可能是最常用的。虽然有一些设置涉及。

+1

嗨,感谢您的帮助!我正在努力使这项工作现在工作得更好。但是,我试图通过bash脚本运行的代码是java,并且我收到“无法找到或加载主类”错误。这是与子进程参数有关吗? – jdv12

+1

这听起来像是你的班级路径的问题。你可以运行你用来在你运行Python脚本的相同工作目录中调用脚本的确切命令吗? –

+1

是的,我刚刚尝试过,它的工作正常。它只有当我试图通过django应用程序运行它时,它无法找到主类。 – jdv12