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

5 投票
4 回答
3033 浏览
提问于 2025-04-11 09:31

我正在尝试写一个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脚本。有没有办法在通过sudo运行的同时与mod脚本进行沟通呢?

4 个回答

1

最简单的办法就是用 sudo 来运行控制脚本(也就是那个 Python 脚本)。你能这样做吗?还是说这不是一个可行的选择?

4

我觉得你应该把你在 Popen 调用中用的 sudo 去掉,让使用你脚本的人自己输入 sudo

这样做可以更清楚地表明你的脚本需要更高的权限,而不是把这个需求藏在 Popen 里面。

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

撰写回答