使用Python模拟在Java程序中输入输入

时间:2016-12-14 19:03:09

标签: java python linux unix stdin

我正在编写一个Python脚本来评分大约300个分配,这些分配使用扫描仪(System.in)进行输入

我认为我能做的事情就像打电话一样简单:

    os.system("cat input.txt | java {} > program_output.txt".format(class_file))

我也试过

    os.system("java {} < input.txt > program_output.txt".format(class_file))

但是,在某些作业中,即使在手动输入输入时效果很好,当它从此input.txt文件获取输入时,程序也会给出错误:

Exception in thread "main" java.util.NoSuchElementException: No line found

这是在前两次调用console.next()之后,并且在调用console.nextLine()

时发生错误

我不知道为什么会这样,但修改每个人的代码并不是很简单,所以我想知道是否有办法使用python模拟输入的实际输入而不是重定向stdin。谢谢!

编辑:为了记录,Java程序无法接受来自stdin的管道的原因是程序创建了多个扫描程序,而不是绕过扫描程序。

3 个答案:

答案 0 :(得分:1)

模拟实际人工输入的最佳方法是pexpect python module,它基于期望Linux实用程序,而且恰好是为了处理交互式工具而制作的。

(一旦到达我的桌面,我会尝试提供示例)

答案 1 :(得分:0)

您确定input.txt文件包含足够的换行符吗?即手动输入时需要的“输入”数量。

要在python中尝试使用subprocess

import subprocess

with open('input.txt') as f:
l=f.readlines()

l=map(lambda x:x.strip(), l) #no newlines we don't want

proc = subprocess.Popen(['python script.py'], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

s = proc.communicate(input='\n'.join(l))

其中script.py是一个类似于java的简单脚本,需要逐行输入

<强> script.py

print "input:"
raw_input()
print 1
raw_input()
print 2
print "done!"

这模拟发送列表的每个元素以及shell中的enter。打印s,我们得到一个元组(stdout,stderr),所以做s[0]会得到你的java结果。

请注意,您必须提供不少于java程序预期的行,如果这样做,重定向stdin也应该有效。

答案 2 :(得分:0)

为了记录,我的解决方案是制作一个AppleScript程序,然后让我的程序调用AppleScript程序:

activate application "Terminal"

tell application "Terminal"

activate


delay 0.2

tell application "System Events"

keystroke "C"

delay 0.2

keystroke return

keystroke "madlib.txt"

delay 0.2

keystroke return

keystroke "madlib_output.txt"

delay 0.2

keystroke return

keystroke "jeopardy"

delay 0.2

keystroke return

keystroke "200"

delay 0.2

keystroke return

keystroke "dollars"

delay 0.2

keystroke return

keystroke "tallest"

delay 0.2

keystroke return

keystroke "moutain"

delay 0.2

keystroke return

keystroke "The United States of America"

delay 0.2

keystroke return

keystroke "V"

delay 0.2

keystroke return

keystroke "madlib_output.txt"

delay 0.2

keystroke return

keystroke "Q"

delay 0.2

keystroke return

end tell

end tell