python - 使用 Python 对 Sicstus 的操作系统系统调用无限期挂起

标签 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,而在于我一般调用程序的方式。这有点让人放心,但我仍然不确定我做错了什么。

最佳答案

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

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

我摆脱了 -i 标志,发现它现在引发了错误“/bin/bash:sicstus:找不到命令”,即使 sicstus 位于我的服务器的 PATH 上,如果我 ssh 我可以称它为罚款进入服务器并直接调用它。我通过指定完整路径解决了这个问题。我现在可以在服务器重新启动之间无限次地检查证明,这很棒。我的代码现在是:

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()

关于python - 使用 Python 对 Sicstus 的操作系统系统调用无限期挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974693/

相关文章:

python - 具有多个应用程序的 Django 并重用相同的数据库表

eclipse - 如何避免 SICStus SPIDER 中的元参数警告?

python - Canopy enthought 虚拟环境 wsgi

python - 无法分配: must be a instance Django foreign Key error

Django 管理员 : ManyToManyField in list_editable?

performance - 是否有库/技术来收集 Prolog 中最佳子句排序的统计信息?

Prolog-从文件加载库

python - 有条件地显示和隐藏表单字段并设置字段值

python - 在 celery worker 中运行测试

python - Pygame 以与玩家相同的方式移动绘制的矩形(不是图像),包括旋转