0

我正在尝试编写一个 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
4

1 回答 1

0

如果没有更多信息(如一些示例 Java 代码),很难确定,但我敢打赌,问题是 Java 代码正在等待一个完整的行,而您还没有发送。

如果是这样,修复很简单:

output = p.communicate(input='5 5 4 3 2 1\n'.encode())[0]

作为旁注,您究竟为什么要调用encode该字符串?它已经以您的源代码使用的任何字符集进行编码。因此,当您调用 时encode,它必须首先将其解码为 Unicode。然后,因为您没有将参数传递给encode,它会将其编码为您的默认字符集 ( sys.getdefaultencoding()),这似乎与 Java 代码所期望的相比,与您已经拥有的相比不太可能匹配。几乎不值得encode用参数调用,而且你几乎应该*永远不要在 a 上调​​用它str,只在 a 上调​​用它unicode

* 如果您想知道,例外情况是您使用少数特殊编解码器,如hexor gzip。在 Python 3 中,他们认为这些特殊情况的偶尔有用性远不及调用encode已编码字符串的频繁错误磁铁,因此他们将其从语言中删除。

于 2015-05-02T03:23:10.520 回答