在Python中提供带有输入的被调用shell脚本

时间:2012-11-06 20:00:34

标签: python python-3.x subprocess

我有一个使用各种Bash shell脚本的python程序。但是,其中一些需要(y / n)输入。我知道根据问题编号所需的输入,所以这是能够自动提供的。

Python有没有办法做到这一点?

作为最后的手段,我可​​以向窗户等发送信号,但我宁愿不这样做。

2 个答案:

答案 0 :(得分:3)

使用subprocess.Popen

from subprocess import Popen, PIPE


popen = Popen(command, stdin=PIPE)
popen.communicate('y')

答案 1 :(得分:3)

可能最简单的方法是使用pexpect。一个例子(来自维基中的overview):

import pexpect

child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('Name .*: ')
child.sendline('anonymous')
child.expect('Password:')
child.sendline('noah@example.com')
child.expect('ftp> ')
child.sendline('cd pub')
child.expect('ftp> ')
child.sendline('get ls-lR.gz')
child.expect('ftp> ')
child.sendline('bye')

如果您不想使用额外的模块,使用subprocess.Popen是可行的方法,但它更复杂。首先,您要创建流程。

import subprocess

script = subprocess.Popen(['script.sh'], stdin=subprocess.PIPE,
                          stdout=subprocess.PIPE, shell=True)

您可以在此处使用shell=True,也可以在命令参数前添加shell的名称。前者更容易。

接下来,您需要先阅读script.stdout,然后才能找到您的问题编号。然后你写下script.stdin的答案。