是否可以使用subprocess.Popen与子子进程通信?

时间:2008-10-30 15:50:52

标签: python subprocess

我正在尝试编写一个打包我们软件的python脚本。这个脚本需要构建我们的产品并打包它。目前我们有其他脚本分别执行每个部分,包括csh和perl脚本。一个这样的脚本运行如下:

sudo mod args

其中mod是perl脚本;所以在python我会做

proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)

问题是这个mod脚本需要回答几个问题。为此,我认为是传统的

(stdout, stderr) = proc.communicate(input='y')

会奏效。我不认为它有效,因为Popen控制的过程是sudo,而不是提出问题的mod脚本。有没有办法与mod脚本通信并仍然通过sudo运行它?

4 个答案:

答案 0 :(得分:4)

我认为您应该删除sudo来电中的Popen,并要求 脚本的用户输入sudo

这使得在脚本中提升权限的需求更加明确,而不是将其隐藏在Popen内。

答案 1 :(得分:4)

我会选择使用Pexpect。

import pexpect
child = pexpect.spawn ('sudo mod -p -c noresource -u dtt -Q')
child.expect ('First question:')
child.sendline ('Y')
child.expect ('Second question:')
child.sendline ('Yup')

答案 2 :(得分:1)

最简单的方法是通过sudo运行控制脚本(Python脚本)。你能做到这一点,还是不是一个选择?

答案 3 :(得分:0)

我们需要更多信息。

  1. sudo是否要求您输入密码?
  2. mod脚本提出什么样的界面来提问?
  3. 因为这些东西在管道上没有正常处理。

    这两者的解决方案可能是Pexpect,它在处理要求密码的有趣脚本以及各种其他输入问题时非常专业。