我试图运行需要连续交互的程序(我必须在我的python脚本中回答字符串:' 0'或' 1')。 / p>
我的代码:
from subprocess import Popen, PIPE
command = ['program', '-arg1', 'path/file_to_arg1']
p = Popen(command, stdin=PIPE, stdout=PIPE)
p.communicate('0'.encode())
最后两行适用于第一次交互,但之后程序会在屏幕上打印所有以下问题,而无需等待各自的输入。我基本上需要回答第一个问题,等到程序处理它并打印第二个问题,然后回答第二个问题,依此类推。
有什么想法吗? 谢谢!
PS:我使用的是Python 3.3.4
答案 0 :(得分:1)
子进程模块专为一次性交互而设计。打印到进程并读取结果,然后停止。与Unix进程进行持续的来回交互是很有挑战性的,在那里你继续轮流阅读和写作。我建议使用为该任务构建的库,而不是从头开始重写所有必要的逻辑。
有一个名为Expect的经典库,可以很好地与子进程进行交互。有一个名为Pexpect的python实现(阅读文档here)。我建议使用Pexpect或类似的库。
Pexpect的工作原理如下:
# spawn a subprocess.
# then wait for expected output from the child process,
# and send additional commands to the child.
child = pexpect.spawnu('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('pexpect@sourceforge.net')
child.expect('ftp> ')
child.sendline('cd /pub/OpenBSD/3.7/packages/i386')
child.expect('ftp> ')