'Communicate' 在 Python 中不起作用
'Communicate' in Python does not work
我正在尝试编写一个 python 程序来测试一个 java 程序,该程序使用 Scanner 从 stdin 获取输入。
所有其他帖子都指向使用 communicate with popen,但对我来说它绝对行不通。当我 运行 我的 python 程序时,它只是调用 popen 然后在 java 程序等待输入时停止。我在 popen 之后写了一个 print 语句来检查。它从不打印。
很简单。我只想给这个等待输入的程序一些输入。
代码如下:
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
时,它必须先 解码 为 Unicode。然后,因为您没有将参数传递给 encode
,它将把它编码为您的默认字符集 (sys.getdefaultencoding()
),这似乎不太可能匹配 Java 代码比你已经拥有的代码更令人期待。几乎不值得用参数调用 encode
,你几乎应该* 永远不要在 str
上调用它,只能在 unicode
.[=21 上调用它=]
* 如果您想知道,例外情况是您使用少数特殊编解码器,如 hex
或 gzip
。在 Python 3 中,他们认为这些特殊情况的偶尔有用性远不及在已编码字符串上调用 encode
的频繁错误磁铁那么多,因此他们将其从语言中删除.
我正在尝试编写一个 python 程序来测试一个 java 程序,该程序使用 Scanner 从 stdin 获取输入。
所有其他帖子都指向使用 communicate with popen,但对我来说它绝对行不通。当我 运行 我的 python 程序时,它只是调用 popen 然后在 java 程序等待输入时停止。我在 popen 之后写了一个 print 语句来检查。它从不打印。
很简单。我只想给这个等待输入的程序一些输入。
代码如下:
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
时,它必须先 解码 为 Unicode。然后,因为您没有将参数传递给 encode
,它将把它编码为您的默认字符集 (sys.getdefaultencoding()
),这似乎不太可能匹配 Java 代码比你已经拥有的代码更令人期待。几乎不值得用参数调用 encode
,你几乎应该* 永远不要在 str
上调用它,只能在 unicode
.[=21 上调用它=]
* 如果您想知道,例外情况是您使用少数特殊编解码器,如 hex
或 gzip
。在 Python 3 中,他们认为这些特殊情况的偶尔有用性远不及在已编码字符串上调用 encode
的频繁错误磁铁那么多,因此他们将其从语言中删除.