Python向Java进程管道输入数据,Java无法接收问题求助
问题分析与解决方案
核心问题是Python的管道输出缓冲区未主动刷新,导致写入的行数据滞留在缓冲区中,没有传递到Java进程的标准输入流,因此Java的readLine()无法接收到完整的行数据,一直处于等待状态。
解决方法
方法1:每次写入后手动刷新缓冲区
在调用write()后,立即调用flush()强制将缓冲区数据发送给Java进程:
from subprocess import Popen, PIPE import time command = ['java', '-jar', 'myprogram.jar'] p = Popen(command, stdin=PIPE) time.sleep(10) print("Process opened and waiting input\n\n\n") for word in ['foo', 'bar', 'baz']: try: p.stdin.write(word.encode() + b'\n') p.stdin.flush() # 关键:刷新缓冲区 except Exception as e: print(e) # 如果后续不再输入,可以关闭stdin,也会触发刷新 # p.stdin.close()
方法2:创建进程时禁用缓冲区
在Popen中设置bufsize=0,让管道无缓冲,写入的数据会立即发送:
from subprocess import Popen, PIPE import time command = ['java', '-jar', 'myprogram.jar'] # bufsize=0 表示无缓冲 p = Popen(command, stdin=PIPE, bufsize=0) time.sleep(10) print("Process opened and waiting input\n\n\n") for word in ['foo', 'bar', 'baz']: try: p.stdin.write(word.encode() + b'\n') except Exception as e: print(e)
补充说明
- Java代码中的外层
while(true)是冗余的,内层while ((line = in.readLine()) != null)已经会循环读取所有输入直到EOF,不过这不会影响当前的stdin通信问题。 time.sleep(10)是为了确保Java进程完全启动,如果你的Java程序启动很快,可以缩短这个时间甚至移除。
内容的提问来源于stack exchange,提问作者user8845408
相关产品推荐
相关产品推荐

