【发布时间】:2026-01-17 14:40:01
【问题描述】:
我正在尝试编写一个 python 程序来测试一个使用 Scanner 从标准输入获取输入的 java 程序。
所有其他帖子都指向使用与 popen 通信,但对我来说它绝对不起作用。当我运行我的python程序时,它只是调用popen,然后在java程序等待输入时停止。我在popen后写了一个打印语句来检查。它从不打印。
它非常简单。我只是想给这个等待输入的程序一些输入。
代码如下:
import os.path, subprocess
from subprocess import PIPE
p = subprocess.Popen(['java', 'Main'], stdin=PIPE, stdout=PIPE)
print 'after subprocess' #this never get's printed
output = p.communicate(input='5 5 4 3 2 1'.encode())[0]
print output
【问题讨论】:
-
如果您将打印更改为“assert False”之类的内容,您会看到回溯吗?根据您的呼叫正在做什么,通信呼叫可能不会立即返回,但 Popen 应该。这对我有用: p = subprocess.Popen(['xargs'], stdin=PIPE, stdout=PIPE);打印 p.communicate(input='hello')
-
他可能看不到
after subprocess的原因是它可能在标准输出的缓冲区中。 (sys.stdout.flush()会解决这个问题。)或者它甚至可能在他用来查看输出的任何东西的 input 缓冲区中,如果他不只是在命令行上运行它的话。无论如何,在他使用 ^C 或其他任何方式终止程序后,输出应该是可见的,但可能与丑陋的回溯混合在一起。 -
不相关:不要在字节串上调用
.encode()。print output语句表明您正在使用 Python 2。 -
Popen()不等待子进程退出。在您的情况下,它不太可能长时间阻塞。如果您在print 'after subprocess'之后添加sys.stdout.flush(),那么您应该会看到该消息。
标签: java python subprocess popen communicate