Web サイトでユーザーからプルーフを受け取り、それを 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 スクリプトは、フィードバック ファイルが生成されるまでループし、これを残りのサーバーに返します。
この関数を初めて呼び出すと、すべてが正常に機能し、期待される出力が得られます。この関数を 2 回目に呼び出すと、プログラムは "p.communicate()" で無期限にハングします。
これは、現在、サーバーの再起動の間にアプリケーションを使用して確認できるプルーフは 1 つだけであることを意味します。サーバーは、再起動の間に無制限の数の証明をチェックできる必要があります。
なぜこれが起こっているのか誰にも分かりますか?必要に応じて、追加情報を含めていただければ幸いです。
アップデート
以下のアドバイスに基づいて、問題がどこにあるのかを判断するために、3 種類の呼び出しを試みました。1 つ目は、私がすでにやろうとしていることです。実際の校正コードで Sicstus を呼び出します。2 つ目は、ハードコーディングされた出力を書き込む非常に単純な Prolog スクリプトを呼び出すことでした。3 つ目は、同じことを行う単純な 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.
3 つのケースすべてで、アプリケーションは 2 回目の呼び出しで引き続きハングアップします。これは、問題がSicstus の呼び出しにあるのではなく、一般的なプログラムの呼び出し方法にあることを意味します。これは少し安心ですが、何が間違っているのかまだわかりません。