stdin(?)中的子流程和其他数据

时间:2019-03-06 14:31:26

标签: python-3.x subprocess

不确定标题是什么,但希望下面的描述足够清楚。

我正在编写一个python脚本,在该脚本中,我有时必须设置一个循环设备,然后要求输入sudo密码。

设置循环设备可以很好地工作,但是stdin / stderr(?)遇到了一些问题,并且保存了比我更喜欢的数据。

到目前为止的代码;

import subprocess
from getpass import getpass, getuser

#these two will be input arguments
loop_device = some loop device
fname = some image file

sudo_password = getpass('[sudo] password for {}: '.format(getuser()))
p = subprocess.Popen(['sudo', '-kSp', '', 'losetup', loop_device, fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out,err = p.communicate((sudo_password+'\n').encode())
print('Out: {}'.format(out)) # for testing
print('Err: {}'.format(err)) # for testing

如果指向有效的文件/环回设备,则终端的输出为:

[sudo] password for user: 
Out: b''
Err: b'[sudo] password for user: '

如果我指向一个不存在的文件,输出为:

Out: b''
Err: b'[sudo] password for user: losetup: /path/to/image/file/: failed to set up loop device: No such file or directory\n'

基本上,我想避免err包含b'[sudo] password for user:部分,以便更容易地检查错误等,例如

if err:
    do something
else:
    keep running

另一种选择是只分配c = b'[sudo] password for user: '并检查err[len(c):]或类似的东西,但是我认为这里缺少一种更好的方法了?

0 个答案:

没有答案