Python 中的“通信”不起作用

问题描述 投票:0回答:1

我正在尝试编写一个 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
python java subprocess popen
1个回答
0
投票

如果没有更多信息(例如一些示例 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 磁力,因此他们将其从语言中删除。

© www.soinside.com 2019 - 2024. All rights reserved.