Подпроцесс и дополнительные данные в stdin (?) - PullRequest
0 голосов
/ 06 марта 2019

Не был уверен, что поставить в качестве заголовка, но надеюсь, что приведенное ниже описание достаточно ясно.

Я пишу скрипт на 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):] или что-то в этом роде, но я предполагаю, что есть лучший способ, который я пропускаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...