使用子进程重复与程序交互

时间:2014-05-15 03:04:16

标签: python subprocess

我试图运行需要连续交互的程序(我必须在我的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

1 个答案:

答案 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> ')