是否可以使用subprocess.Popen与子子进程通信?
-
05-07-2019 - |
题
我正在尝试编写一个打包我们软件的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运行它?
解决方案
我会选择使用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')
其他提示
我认为您应该删除 Popen
调用中的 sudo
,并要求您的脚本的用户键入 sudo 代码>
这另外使得在脚本中需要提升权限,而不是将其隐藏在 Popen
中。
最简单的方法是通过 sudo
运行控制脚本(Python脚本)。你能做到这一点,还是不是一个选择?
我们需要更多信息。
- sudo是否要求您输入密码?
- mod脚本提出什么样的界面来提问? 醇>
因为这些东西在管道上没有正常处理。
这两者的解决方案可能是 Pexpect ,这在处理搞笑方面相当专业要求输入密码的脚本以及各种其他输入问题。
不隶属于 StackOverflow