如何与控制台应用程序交互,就好像我是一个用户键入的东西进去?(How do I interact w

2019-10-29 14:15发布

我想编写与bsdgames跋涉程序交互Python程序。 这有点像魔域与克林贡:

   * * *   S T A R   T R E K   * * *

Press return to continue.

What length game: short
What skill game: fair
Enter a password: hunter2
10 Klingons
2 starbases at 3,6, 0,2
It takes 400 units to kill a Klingon

Command: 

我目前正在尝试使用subprocess.Popen()与它交互:

>>> import subprocess
>>> t = subprocess.Popen('trek', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

不幸:

>>> t.communicate('')
('', None)
>>> t.poll()
-2
>>> t.communicate('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 754, in communicate
    return self._communicate(input)
  File "/usr/lib/python2.7/subprocess.py", line 1297, in _communicate
    self.stdin.flush()
ValueError: I/O operation on closed file

它只要我本身结束.communicate()它。 这似乎给我的第一反应.communicate()

>>> t = subprocess.Popen('trek', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> t.communicate('\n')
('\n   * * *   S T A R   T R E K   * * *\n\nPress return to continue.\nWhat length game: ', None)

但我需要能够读取标准输出,能够找出下一个标准输入应该是什么。 所以,我怎么送东西到标准输入,而不做一切告诉跋涉那这就是它的输入的结束?

编辑:有人建议t.stdin.write() 这工作,但现在我不能找到一种方法来读取结果:

>>> t.stdin.write('\n')
>>> t.poll()
>>> t.stdout.read()

这永远挂着这样:

^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>> t.stdout.readline()
''

所以,现在这是怎么回事?

Answer 1:

假设这是Linux操作系统,使用Pexpect的模块。 这是写处理的互动节目。 技术,如通信,()不工作,因为他们等待程序退出。 简单的读不起作用,因为该程序还没有刷新其粗壮所以没有什么阅读。 你可以创建自己的PTY和使用,调用POPEN(时)或让Pexpect的做的工作适合你。



文章来源: How do I interact with a console app as if I'm a user typing things into it?