不确定标题是什么,但希望下面的描述足够清楚。
我正在编写一个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):]
或类似的东西,但是我认为这里缺少一种更好的方法了?