gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:47 24 4
gpt4 key购买 nike

我正在尝试编写一个校对应用程序,该应用程序从网站上的用户接收校样并将其发送到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com