我正在尝试编写一个 python 程序来测试一个使用 Scanner 从 stdin 获取输入的 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
如果没有更多信息(例如一些示例 Java 代码),很难确定,但我敢打赌问题是 Java 代码正在等待完整的一行,而您还没有发送。
如果是这样,修复很简单:
output = p.communicate(input='5 5 4 3 2 1\n'.encode())[0]
顺便说一句,你到底为什么要在该字符串上调用
encode
?它已经以源代码使用的任何字符集进行编码。因此,当您调用 encode
时,它必须首先将其 decode 为 Unicode。然后,因为您没有将参数传递给 encode
,所以它会将其编码为您的默认字符集 (sys.getdefaultencoding()
),这似乎与 Java 代码所期望的不太可能匹配你已经拥有了。很少值得用参数来调用 encode
,而且你应该几乎* 永远不要在 str
上调用它,而只能在 unicode
上调用它。
* 如果您想知道,例外情况是当您使用一些特殊编解码器(如
hex
或 gzip
)时。在 Python 3 中,他们认为这些特殊情况的偶尔用处远不及在已编码字符串上调用 encode
的频繁 bug 磁力,因此他们将其从语言中删除。