0

SPARC ASP 솔버 인 Python2.7을 사용하고 있으며 Ubuntu14.04 명령에서 코드를 실행 중입니다. 선.Python2.7과 ASP 간의 양방향 통신 시도 : 작동하지 않는 텍스트 파일에 명명 된 파이프 내용 쓰기

파이썬 코드와 ASP (응답 설정 프로그래밍) 코드 사이에 양방향 통신을 설정하려고합니다. 이렇게하려면 파이썬에서 ASP로 쿼리를 보내고 ASP 응답을 FIFO 파이프에 넣고 파이썬 코드에서 FIFO의 내용을 문자열로 읽은 다음 문자열을 텍스트 파일에 씁니다. 텍스트 파일에서 내가 예상 한 결과를 얻고 있는지 확인할 수 있습니다.) 그러나 두 가지 문제가 발생합니다. 예상되는 응답의 일부만이 전체가 아니라 텍스트 파일에 표시됩니다. 파이썬 코드는 무한 루프에 있지만 루프는 한 번만 실행되는 것처럼 보입니다. 무슨 일 이니?

유감스럽게도 스택 오버플로에 대해 더 작은 질문을 던지고 있지만이 사이트의 유능한 사람들이 제공 한 유용한 답변에도 불구하고 여전히 아무 곳에도 없습니다. 문제는 어디에서 발생합니까? 거짓말. 그래서 나는 누군가가 나를이 문제를 해결할 수 있도록 도와 줄 수 있기를 희망하며 모든 코드를 게시 할 것이다.

내 파이썬 코드 :

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을 확인하십시오. 엉 쓰기. 'yes'가 없으면 항상 단지 ?-입니다. 또한 파이썬 코드가 한 번만 실행된다는 것을 알 수 있습니다. 쓰기 대신 텍스트 파일에 추가 할 때 코드를 실행할 때마다 한 줄만 추가되기 때문입니다. ASP 솔버 의 출력은이어야합니다. ?- yes이어야합니다.

명령 줄에 > fifo 대신 > sparc.out을 입력하면 (결과적으로 fifo를 먼저 통과하지 않고 출력을 텍스트 파일에 직접 입력 할 수 있기 때문에) 문제가 ASP 코드에있는 것으로 의심됩니다. 텍스트 파일 ?- yes의 수십 번의 반복을 포함하는데, 이는 내가 기대하는 것입니다.

필자는 텍스트 파일에 대한 읽기/쓰기 작업이 너무 느려서 코드 작성을위한 응용 프로그램이 너무 느리기 때문에 (텍스트 파일에 출력을 쓰는 대신 FIFO를 사용하는 방법을 알아야합니다. turtlebot : 로봇에서 텍스트 파일 버전을 테스트했을 때 텍스트 파일에서 읽을 때마다 일시 중지 되었기 때문에 끊임없이 멈추고 시작되었습니다.

나는 모든 코드를 게시물에 버리고 '나를 위해 고쳐라!'라고 말하는 것이 좋지 않다는 것을 알고 있습니다.하지만 저는 현명합니다. 누군가가 양방향 의사 소통을 도와 줄 수 있다면 너무 감사 할 것입니다.

답변

1

나에게 버퍼링 문제가있는 것 같습니다. write을 사용한다고해서 다른 프로세스가 귀하의 메시지를 완전히 받았음을 의미하지는 않습니다. 단지 내부 쓰기 버퍼에 복사되었음을 의미합니다. 이 버퍼는 일반적으로 4k 크기이며, 완전히 채워지지 않으면 아무것도 끝까지 보내지 않습니다. 마찬가지로, read 때 7 바이트를 즉시 사용할 수 있다고 기대할 수 없습니다. 다른 쪽에서 충분히 보낼 수 없을 수도 있습니다. SPARC가 즉시받은 '?- '을 인쇄 한 다음 아직 보내지 않은 입력을 기다릴 가능성이 큽니다.flush과 함께 쓰기 버퍼를 강제로 보낼 수 있습니다. 또한stdout (비어 있지 않은 쓰기 버퍼를 보내기 위해 암시 적으로 flush을 호출해야 함)이 필요할 수 있습니다. SPARC은 EOF가 계산되기 전에 대기 할 수 있기 때문입니다.

는 귀하의 의견을 보낸 후 (flush를 호출하는) sys.stdout.close를 사용해보십시오, 당신은 반환 값으로 0을받을 때까지 순간에 사용할 수보다 적은 7 바이트가있을 수 있으므로, 루프에서 read를 사용합니다.

다음은 stdio 버퍼링에 대한 개요입니다. http://www.pixelbeat.org/programming/stdio_buffering/

관련 문제