1

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 の呼び出しにあるのではなく、一般的なプログラムの呼び出し方法にあることを意味します。これは少し安心ですが、何が間違っているのかまだわかりません。

4

1 に答える 1

1

最終的に、この問題を修正することができました。

問題は、-i (インタラクティブ) フラグを bash に追加することは、入力が必要であることを意味し、その入力が得られなかった場合、2 回目の呼び出しでプロセスを中断したことだと思います。これは、プロセスをより単純なもので複製しようとしたときに起こったことです。

-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()
于 2014-06-04T15:16:01.923 に答える