首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django框架中使用java代码

在django框架中使用java代码
EN

Stack Overflow用户
提问于 2016-03-21 14:08:21
回答 1查看 2.5K关注 0票数 1

好的,我有一个简单的界面,我用Django框架设计了这个界面,它接受用户的自然语言输入,并将其存储在表中。

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

我想要做的是接受用户提供的输入,然后将其提交一次,将其导入我的java管道,然后将带注释的输出反馈到数据库中。

我对这方面的web开发很陌生,在这个意义上,我真的找不到任何关于集成脚本的东西。所以,如果有人能给我指出一个有用的资源,或者只是在一个正确的方向,那将是非常有帮助的。

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

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

代码语言:javascript
复制
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.  

我试图做的事情的一个简单的概述:

这是我在视图中的代码。它的目的是从模型表单中获取文本输入,将其发布到DB中,然后将该输入传递到我的脚本中,该脚本生成一个XML文件,该文件存储在DB中的另一列中。我对django非常陌生,所以我很抱歉,如果这是一个简单的修复,但我找不到任何文档有关django的子进程是有帮助的。

代码语言:javascript
复制
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) 

模型代码片段:

代码语言:javascript
复制
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:好的,通过更改子进程代码,代码不再中断,如下所示

代码语言:javascript
复制
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上运行得很好。这就是我试图用子进程调用的脚本。

代码语言:javascript
复制
#!/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

我不知道该如何修复这个错误,所以任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2016-03-26 12:30:18

如果我正确地理解了您,您希望将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,芹菜可能是最常用的。不过,这也涉及到一些设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36133242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档