2013-07-20 2 views
5

R에서는 pipe()을 사용하여 파이프 연결을 열어 쓸 수 있습니다. 내가 이해하지 못하는 다음 상황을 관찰했다. 이제 예를 들어 python 파이프를 사용하자 :R에서 파이프 연결을 닫기 전에 파이프 연결에서 출력을 얻는 방법?

: print()의 출력이 바로 R 콘솔에 표시 될했지만, 사실은 출력이 나는 파이프 연결을 종료 한 후에 만 ​​온다 내가 기다리고 있었다

z = pipe('python', open='w+') 

cat('x=1\n', file=z) 
cat('print(x)\n', file=z) 
cat('print(x+2)\n', file=z) 
cat('print(x+2\n', file=z) 
cat(')\n', file=z) 

close(z) 

> z = pipe('python', open='w+') 
> 
> cat('x=1\n', file=z) 
> cat('print(x)\n', file=z) 
> cat('print(x+2)\n', file=z) 
> cat('print(x+2\n', file=z) 
> cat(')\n', file=z) 
> 
> close(z) 
1 
3 
3 

제 질문은 연결을 종료하기 전에 어떻게 출력을 얻을 수 있습니까? 이 질문의

> z = pipe('python', open='w+') 
> 
> cat('x=1\n', file=z) 
> cat('print(x)\n', file=z) 
> cat('print(x+2)\n', file=z) 
> cat('print(x+2\n', file=z) 
> cat(')\n', file=z) 
> 
> x = capture.output(close(z)) 
1 
3 
3 
> x 
character(0) 

배경은 knitr engines입니다 : 하나, 그것은 capture.output()를 사용하여 출력을 캡처 할 수있을 것 같지 않습니다. 파이썬 같은 인터프리터 언어의 경우, 영구적 인 "터미널"을 열어서 코드를 계속 작성하여 출력 할 수 있기를 바랍니다. 그래도 pipe()이 올바른 방법인지 확실하지 않습니다.

답변

5

파이썬은 입력이 대화 형이 아니며 코드를 구문 분석하고 실행하기 위해 연결이 닫힐 때까지 기다린다는 것을 알아 차렸습니다. -i 옵션을 사용하여 강제로 대화식 모드로 유지할 수 있습니다. (하지만 출력은 약간 엉망이된다).

z = pipe('python -i', open='w') 
cat('x=1\n', file=z) 
cat('print(x)\n', file=z) 
cat('print(x+2)\n', file=z) 
cat('print(x+2\n', file=z) 
cat(')\n', file=z) 
Sys.sleep(2) 
# Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
# [GCC 4.7.3] on linux2 
# Type "help", "copyright", "credits" or "license" for more information. 
# >>> >>> 1 
# >>> 3 
# >>> ... 3 
# >>> 
close(z) 

실제 문제는 더 복잡합니다. 동일한 연결을 읽고 쓰는 것이 필요합니다. 이 방법을 이식성있는 방법으로 수행 할 수는 없지만이를 지원하는 플랫폼에서 파이프와 명명 된 파이프 ("fifo")를 사용할 수 있습니다.

stopifnot(capabilities("fifo")) 
system('mkfifo /tmp/Rpython.fifo') 
output <- fifo('/tmp/Rpython.fifo', 'r') 
input <- pipe('python -i > /tmp/Rpython.fifo', 'w') 
python_code <- " 
x=1 
print(x) 
print(x+2) 
print(x+2 
) 
" 
cat(python_code, file = input) 
flush(input) 
Sys.sleep(2) # Wait for the results 
result <- readLines(output) 
result 
# [1] "1" "3" "3" 
관련 문제