【发布时间】:2012-05-28 05:36:38
【问题描述】:
我有一个程序需要作为 python 的子进程调用。该程序是用java编写的。是的,我知道...
无论如何,我需要捕获该程序的所有输出。
不幸的是,当我使用communicate[0] 调用subprocess.popen2 或subprocess.Popen 时,当我使用分配给stdout 的subprocess.PIPE 和使用时,我丢失了大约10% 的输出数据分配给标准输出的文件描述符(从打开返回)。
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
...
【问题讨论】:
-
是否有可能将某些输出写入标准错误?
-
我们可以提供一些 Python 代码吗?
-
你错过了哪“10%”?是开始还是结束?你期待什么输出?
-
你确定你的 java 子进程本身没有分叉吗?这或许可以解释为什么您的
wait()呼叫似乎没有被阻止。 -
更具体地说,使用
subprocess.PIPE或将 fd 分配给子进程的输出与您的 shell 在执行输出重定向到文件时所做的完全相同(操作系统的dup2()系统称呼)。您可以放心地假设该部分正在工作。您可以尝试添加 "` | tee outputcopy" at the end of your command there; then you could check thatoutputcopy` 具有您期望的所有行。如果没有,可能您的 java 程序运行不正确。
标签: python subprocess