나는 파이썬으로 서브 프로세스로 호출되어야하는 프로그램을 가지고있다. 이 프로그램은 자바로 작성되었습니다. 그래, 나도 알아 ...프로그램의 표준 출력의 10 %를 잃는 파이썬 서브 프로세스
어쨌든, 나는 모든 프로그램의 출력을 캡처해야합니다.
불행히도 subprocess.popen2 또는 subprocess.Popen을 communicate [0]이라고하면 부 프로세스를 사용할 때 출력 데이터의 약 10 %가 손실됩니다 .PIPE는 stdout에 할당되고, stdout에 할당 된 파일 설명자 (열린 리턴)를 사용합니다.
하위 프로세스의 설명서는 하위 프로세스의 모든 출력을 캡처하려는 경우 subprocess.PIPE를 사용하는 것이 매우 휘발성이라는 것을 분명히 보여줍니다.
저는 현재 pexpect를 tmp 파일로 출력하기 위해 pexpect를 사용하고 있습니다. 그러나 명백한 이유 때문에 영원히 계속됩니다.
디스크 쓰기를 피하기 위해 모든 데이터를 메모리에 보관하고 싶습니다.
어떤 권고든지 환영 받다! 감사!
import subprocess
cmd = 'java -Xmx2048m -cp "/home/usr/javalibs/class:/home/usr/javalibs/libs/dependency.jar" --data data --input input"
# doesn't get all the data
#
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
output = p.communicate()[0]
OR
# doesn't get all the data
#
fd = open("outputfile",'w')
p = subprocess.Popen(cmd, stdout=fd, shell=True)
p.communicate()
fd.close() # tried to use fd.flush() too.
# also tried
# p.wait() instead of p.communicate(), but wait doesn't really wait for the java program to finish running - it doesn't block
OR
# also fails to get all the data
#
import popen2
(rstdout, rstdin) = popen2.popen2(cmd)
예상 출력은 일련의 아스키 라인 (몇 천 개)입니다. 라인은 숫자와 내가 stdout
에 훨씬 더 큰 출력 subprocess
을 사용했지만 같은 문제를 보지 못했다
0\n
1\n
4\n
0\n
...
일부 출력이 stderr에 기록 될 수 있습니까? – Jeremiah
헤이, stdout (표준 오류가 아님)을 캡처하려고합니다. 출력은 숫자와 줄 끝 문자입니다. 모든 아스키 출력을 기대합니다. –
파이썬 코드가 있습니까? – Bittrance