python - 使用 python 写入标准输入后出现异常
问题描述
我正在尝试编写一个 Python 脚本来执行 Java 文件并模拟用户输入。为此,我需要能够发送一些东西,阅读输出,然后当我再次被提示时再次写一些东西。
我发现这部分工作
def execute_java_in(path):
print(f"java {os.path.abspath(path)}")
p = Popen(['java', os.path.abspath(path)], stdout=PIPE, stderr=PIPE, stdin=PIPE, encoding="utf-8")
output, error = p.communicate(input="5789")
print(output)
print(error)
output, error = p.communicate(input="5239")
print(output)
print(error)
第一个输入提示正确的响应,但随后java.util.NoSuchElementException
引发了 an 。我猜通信是在我的输入之后向标准输入写入一些东西,这是应该读取下一个输入时的第一个字母。我也尝试过stdin.write()
,stdout.read()
但随后stdout.read()
阻止了所有进一步的命令。有没有人知道还有什么可以尝试的?
解决方案
这取决于 Java 程序的功能。
您可以为调用添加timeout
参数。communicate
您也可以立即提供两个输入:
output, error = p.communicate(input="5789\n5239\n")
如果它仍然引发NoSuchElementException
s,我们无法在没有 Java 代码的情况下为您提供帮助。
推荐阅读
- java - 汇总列表中的所有属性值
- python - 我可以获取一个已经初始化的类 __init__ 参数,更改它并重新初始化它吗
- npm - 更新传递依赖
- dbeaver - 是否可以在 DBeaver SQL 语句中创建一个“if”来测试当前连接(Oracle、SQLServer 等)?
- objective-c - 从 LSOpenFromURLSpec 获取 NSRunnnunigApplication
- python - 何时在 Python 中使用哪些数组实现?
- python - 修复损坏的 python 环境?
- python - 通过循环将多边形内的所有点作为值添加到字典对象
- laravel - 如何在 Laravel 构造函数中正确设置和获取 Guzzle 客户端对象值?
- python - 使用 scrapy / sitemaps 抓取具有不同项目的产品