Python でサブプロセスとして呼び出す必要があるプログラムがあります。プログラムはJavaで書かれています。ええ、私は知っています...
とにかく、上記のプログラムからのすべての出力をキャプチャする必要があります。
残念ながら、subprocess.popen2 または subprocess.Popen を communicate[0] で呼び出すと、stdout に割り当てられた subprocess.PIPE を使用している場合と、ファイル記述子を使用している場合に、出力データの約 10% が失われます。 (open からの戻り) stdout に割り当てられます。
subprocess のドキュメントは、子プロセスからのすべての出力をキャプチャしようとしている場合、 subprocess.PIPE の使用が揮発性であることを明確に示しています。
私は現在 pexpect を使用して出力を tmp ファイルにダンプしていますが、明らかな理由で永遠に時間がかかります。
ディスクへの書き込みを避けるために、すべてのデータをメモリに保持したいと思います。
どんなお勧めも大歓迎です!ありがとう!
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)
予期される出力は、一連の ASCII 行 (数千行) です。行には数字と行末文字が含まれています
0\n
1\n
4\n
0\n
...