0

私は SPARC ASP ソルバーである Python2.7 を使用しており、Ubuntu14.04 コマンドラインからコードを実行しています。

Python コードと ASP (answer-set-programming) コードの間で双方向通信を設定しようとしています。これを行うには、Python から ASP にクエリを送信し、ASP 応答を fifo パイプに入れます。Python コードでは、fifo の内容が文字列に読み込まれ、その文字列がテキスト ファイルに書き込まれます (これはテキスト ファイルをチェックして、期待どおりの出力が得られているかどうかを確認できます)。ただし、2 つの問題が発生しています。期待される応答の全体ではなく、一部のみがテキスト ファイルに表示されます。また、Python コードは無限の while ループにありますが、一度だけ実行されているように見えます。何がうまくいかないのですか?

残念なことに、何日にもわたってスタック オーバーフローについて調査し、小さな質問をしてきましたが、このサイトの善良な人々によって非常に有用な回答が提供されたにもかかわらず、私はまだどこにも行き着いておらず、コードのどこに問題があるのか​​ わかりません。したがって、誰かがこの問題を完全に解決するのを手伝ってくれることを期待して、すべてのコードを投稿します。

私のpythonコード:

import sys
import os

while True:
    # communicate with ASP code
    try:
        sys.stdout.write('moveForward(turtlebot)\n')
    except KeyboardInterrupt:
        sys.stdout.write('moveForward(turtlebot)\n')
        sys.exit()

    # read back the output of the ASP code - should be '?- yes'
    try:
        fifo = os.open('fifo', os.O_RDONLY)
        string = os.read(fifo, 7)
        os.close(fifo)
    except KeyboardInterrupt:
        fifo = os.open('fifo', os.O_RDONLY)
        string = os.read(fifo, 7)
        os.close(fifo)
        sys.exit()  

    # write the latest output to the text file
    try:
        myfile = open("afile.txt", "w")
        myfile.write(string)
        myfile.close()
    except KeyboardInterrupt:
        myfile = open("afile.txt", "w")
        myfile.write(string)
        myfile.close()
        sys.exit()

私の ASP コード:

sorts
#robot = {turtlebot}.

predicates
moveForward(#robot).

rules
moveForward(turtlebot).

コマンドラインからコードを実行する方法:

mkfifo fifo
python test.py | java -jar sparc.jar aspfile.sp > fifo

何が起こっているか:
コードを実行した後、afile.txt何が書き込まれたかを確認します。?-「はい」なしで、常にただです。また、書き込みではなくテキスト ファイルに追加すると、コードを実行するたびに 1 行しか追加されないため、Python コードが 1 回しか実行されていないこともわかります。ASP ソルバーからの出力はになります?- yes

問題が ASP コードにあるとは思えません。なぜなら、> sparc.out代わりにコマンド ラインに入力すると> fifo(最初に fifo を経由せずに出力がテキスト ファイルに直接出力されるようにするため)、テキスト ファイルには , の繰り返しが何十回も含まれているからです?- yes。これは私が期待するものです。

出力をテキスト ファイルに書き込むだけでなく、FIFO を使用する方法を理解する必要があります。これは、テキスト ファイルから常に読み書きするのは、コードの対象となるアプリケーションにとって遅すぎるためです (タートルボットのアクション プランを作成するとき)。テキストファイルから読み取るたびに一時停止するため、ロボットが常に停止して開始するテキストファイルバージョンをテストしました)。

すべてのコードを投稿にダンプして、「私のために修正してください!」と言うのはあまり良い形式ではないことはわかっていますが、私は頭がおかしいです。誰かが私が双方向通信を機能させるのを手伝ってくれたら、とても感謝しています.

4

1 に答える 1