Python子进程失去了程序标准输出的10%

我有一个程序,需要被称为与Python的子进程。 该程序已用java编写。 是的,我知道...

无论如何,我需要捕获所有程序的输出。

不幸的是,当我使用通信[0]调用subprocess.popen2或subprocess.Popen时,当我使用子进程时,输出数据的大约10%会丢失。分配给stdout的AND会在我使用文件描述符(从开放返回)分配给标准输出。

子进程中的文档非常明确,使用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行(几千)。 这些行包含一个数字和一个行尾字符

0n
1n
4n
0n
...

我在stdout输出上使用了具有更大输出的subprocess ,但没有看到这样的问题。 从你所展示的内容来看,很难总结出根源。 我会检查以下内容:

由于p.wait()不适合你。 可能是这样的,当你读你的PIPE你的java程序仍然忙于打印最后的10%。 首先获得p.wait()

  • 在阅读PIPE之前插入足够长的等待时间(比如说30秒),你的10%显示出来了吗?
  • p.wait()不会阻止你的java程序是值得怀疑的。 你的java程序是否进一步子处理其他程序?
  • 检查p.wait()的返回值。 你的java程序是否正常终止?
  • 如果问题不在您的并发模型中,请检查您的Java程序是否正确打印:

  • 你在java程序中用什么函数打印到stdout ? 它是否倾向于或忽略IOException
  • 你是否正确冲洗了流? 当你的java程序终止时,最后的10%可能在你的缓冲区没有适当的刷新。

  • 它必须与你实际调用的过程有关。 您可以通过使用另一个可以回显行的python脚本进行简单的测试来验证这一点:

    out.py

    import sys
    
    for i in xrange(5000):
        print "%dn" % i
    
    sys.exit(0)
    

    test.py

    import subprocess
    
    cmd = "python out.py"
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
    output = p.communicate()[0]
    
    print output
    

    所以你可以验证它不是问题数据的大小,而是与你正在调用的进程的通信。

    您还应该确认您正在运行的python版本,因为我已经阅读了关于Popen内部缓冲区的过去问题(但使用了一个单独的文件句柄,正如您建议的那样,通常会为我解决这个问题)。

    如果子进程调用被无限期挂起,那将会是一个缓冲区问题。 但是如果这个过程正在完成,只是缺乏线路,那么Popen正在做它的工作。

    链接地址: http://www.djcxy.com/p/77107.html

    上一篇: Python subprocess losing 10% of a program's stdout

    下一篇: Broken Pipe from subprocess.Popen.communciate() with stdin