Получение stdout из консоли - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь создать сценарий python, который будет клонировать (образ ISO) один USB-накопитель на другой, используя dd if=/dev/sda of=/dev/sdb

Вот моя проблема: Я хочу создать индикатор выполнения, показывающий, что сделано.

Я пробовал:

  1. Глядя на место для хранения на втором USB-накопителе, но это не работает, потому что образ ISO сканирует также неиспользуемое пространство
  2. Добавляя команду status=progress к dd, я могу получить прогресс в терминале, но я не могу понять, как получить доступ к stdout из python. Я пробовал subprocess.Popen,run(stdout = PIPE) с shell = True и без *, читая process.stdout с .read(), .read(1), .readline() или communicate(). У меня ничего не сработало. (https://www.endpoint.com/blog/2015/01/28/getting-realtime-output-using-python)

Я вижу прогресс в оболочке python, но функция .read() всегда застревает.

Часть кода, которая меня беспокоит:

comm = 'sudo dd if=/dev/sda of=/dev/sdb'
cloning = subprocess.Popen(shlex.split(comm),stdout = PIPE,text = True)
while True:
    print(cloning.stdout.read())

Мне нужно что-то, что работало бы примерно так:

while True:
    progress = cloning.stdout.read()
    update_bar(progress)

Я использую python 3.7 на Raspberry

Спасибо за помощь

1 Ответ

0 голосов
/ 09 мая 2020

Вы были на правильном пути с status=progress, но он выводит на stderr, а не на stdout. Если вы выполните stderr = PIPE, а затем прочитаете из cloning.stderr вместо cloning.stdout, это будет работать.

...