gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:01:45 24 4
gpt4 key购买 nike

我有一个程序需要作为 python 的子进程调用。该程序是用java编写的。是的,我知道...

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

不幸的是,当我使用 communic[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
...

最佳答案

我曾使用 subprocessstdout 上输出更大的输出,但没有看到这样的问题。很难从您所展示的内容中得出根本原因是什么。我会检查以下内容:

因为 p.wait() 不适合你。可能是这样的情况,当您阅读 PIPE 时,您的 java 程序仍在忙于打印最后 10%。首先直接获取 p.wait():

  • 在阅读 PIPE 之前插入足够长的等待时间(例如 30 秒),您的 10% 出现了吗?
  • p.wait() 不会阻塞您的 java 程序是值得怀疑的。您的 Java 程序是否进一步子处理其他程序?
  • 检查 p.wait() 的返回值。您的 Java 程序是否正常终止?

如果问题不在于您的并发模型,那么请检查您是否在您的 java 程序中正确打印:

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

关于Python 子进程丢失了程序标准输出的 10%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com