操作系统调用Sicstus使用Python无限期挂起

时间:2014-05-31 21:38:05

标签: python django sicstus-prolog

我正在尝试编写一个校对应用程序,该应用程序从网站上的用户接收证据并将其发送到Prolog脚本以检查其有效性。

我使用的是Django,Python 2.7和Sicstus。在我的服务器" view.py"文件,我调用python脚本" checkProof.py",传递用户提交的证明的原始文本格式。在该文件内部,我有以下功能:

def checkProof(pFile, fFile):
    p = subprocess.Popen(['/bin/bash', '-i', '-c', 'sicstus -l ProofServer/server/proofChecker.pl -- %s %s' % (pFile, fFile)],
        stdout=subprocess.PIPE)
    p.communicate() # Hangs here.

proofChecker.pl接收证明的修改版本(pFile),对其进行分析并将反馈输出到反馈文件(fFile)。 Python脚本循环直到生成反馈文件,并将其返回给服务器的其余部分。

我第一次调用此函数时,一切正常,我得到了预期的输出。第二次调用此函数时,程序无限期挂起在" p.communicate()"。

这意味着,目前在服务器重启之间只能使用应用程序检查一个证据。服务器应该能够在重新启动之间检查无限数量的证明。

有谁知道为什么会这样?如有必要,我很乐意提供其他信息。

更新

根据下面给出的建议,我尝试了三种不同的调用来尝试确定问题所在。第一个是我试图做的事情 - 在我真正的校对代码上调用Sicstus。第二个是调用一个非常简单的Prolog脚本来编写硬编码输出。第三个是一个简单的Python脚本,它也是如此:

def checkProof(pFile, fFile):
  cmd1 = 'sicstus -l ProofServer/server/proofChecker.pl -- %s %s' % (pFile, fFile)
  cmd2 = 'sicstus -l ProofServer/server/tempFeedback.pl -- %s %s' % (pFile, fFile)
  cmd3 = 'python ProofServer/server/tempFeedback.py %s %s' % (pFile, fFile)
  p = subprocess.Popen(['/bin/bash', '-i', '-c', cmd3],
      stdout=subprocess.PIPE)
  p.communicate() # Hangs here.

在所有三种情况下,应用程序继续挂起第二次尝试呼叫。这意味着问题是与调用Sicstus,但只是我一般调用程序的方式。这有点令人放心,但我仍然不确定我做错了什么。

1 个答案:

答案 0 :(得分:1)

我最终设法解决了这个问题。

我认为问题在于将-i(交互式)标志附加到bash意味着它预期输入,并且当它没有获得该输入时它会在第二次调用时暂停该过程。这就是尝试用更简单的东西复制过程时发生的事情。

我摆脱了-i标志,发现它现在引发了错误" / bin / bash:sicstus:command not found",即使sicstus在我的服务器的路径上如果我直接进入服务器并直接调用它,我可以称之为正常。我通过指定完整路径来修复此问题。我现在可以在服务器重启之间无限次地检查证明,这很好。我的代码现在是:

def checkProof(pFile, fFile):
  cmd = '/usr/local/sicstus4.2.3/bin/sicstus -l ProofServer/server/proofChecker.pl -- %s %s' % (pFile, fFile)
  p = subprocess.Popen(['/bin/bash', '-c', cmd])
  p.communicate()