【问题标题】:Using java code in the django framework在django框架中使用java代码
【发布时间】:2016-03-21 14:08:21
【问题描述】:

好的,所以我有一个使用 Django 框架设计的简单界面,它从用户那里获取自然语言输入并将其存储在表中。

此外,我有一个使用 Java 构建的管道,使用 cTAKES 库进行命名实体识别,即它将获取用户提交的文本输入并使用相关的 UMLS 标记对其进行注释。

我想要做的是从用户那里获取输入,然后提交一次,将其引导到我的 java-cTAKES 管道中,然后将带注释的输出反馈回数据库。

我对这方面的 Web 开发方面还很陌生,并且在这个意义上找不到关于集成脚本的任何内容。因此,如果有人可以向我指出有用的资源或只是大体上正确的方向,那将非常有帮助。

========================== 更新:

好的,所以我发现子流程是我想在这种情况下使用的模块,我已经尝试根据文档实现一些简单的代码,但我得到了一个

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) 

型号代码sn-p:

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”,因为脚本在这个工作目录中的 shell 中运行良好。这是我试图用子进程调用的脚本。

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

我不确定如何解决此错误,因此感谢您的帮助。

【问题讨论】:

  • 我对 cTAKES 一点也不熟悉,所以如果这是一个无知的问题,我深表歉意:您是否已经在现有机器上运行此 Java 服务并希望从您的 Web 应用程序将数据传输到它,还是您希望同时部署 Web 应用和 Java 应用?
  • 我希望将管道部署为 Web 应用程序的一部分。我想在内部使用 java 脚本。

标签: java django ctakes


【解决方案1】:

如果我理解正确,您希望将 request.POST['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 shell 中工作的子进程,然后将其集成到您的 Django 应用程序中。

请注意,在请求中创建(可能长时间运行的)子进程是非常糟糕的做法,并且会导致很多问题。最佳实践是在作业队列中委派长时间运行的任务。对于 Django,Celery 可能是最常用的。不过,这涉及到一些设置。

【讨论】:

  • 您好,感谢您的帮助!我正在努力让它现在工作并且它工作得更好。但是,我试图通过 bash 脚本运行的代码是 java,我收到“无法找到或加载主类”错误。这与子流程参数有关吗?
  • 这听起来像是你的类路径的问题。您可以在运行 Python 脚本的同一工作目录中运行用于调用脚本的确切命令吗?
  • 是的,我刚试过,它工作正常。只有当我尝试通过 django 应用程序运行它时,它才能找到主类。
  • 我想我在我的 bash 脚本中发现了这个问题,但我不确定如何解决它。对于我想通过我的 bash 脚本运行的 jar 类,我将参数指定为 CLINICAL_PIPELINE_JAR="target/CtakesClinicalPipeline-0.0.1-SNAPSHOT.jar" ,当我将其更改为完整路径时,它从标准 shell 运行,但是,我得到与尝试通过 django 运行它时相同的错误。那么我会在基于 django 的调用中指定整个路径吗?
  • 嗨,我尝试了一些方法无济于事,但我在我的编辑中发布了上面的完整 bash 脚本。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2021-11-03
  • 2022-08-22
  • 2014-08-25
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多