@HighMan

Python3 как выполнить сложную коммандную строку?

Здравствуйте, коллеги!
i = 4
disk = {'path': '/dev/vdb'}
d = f'echo -ne "label:gpt\nsize=512M,type=U\nsize=2G\nsize={i}G,type=S\n+\n" | sfdisk {disk["path"]}'
i = os.system(d)
print(f"Return code: {i}")

Ага-ага. В d находится строка, которую нужно выполнить.
И она даже выполняется!
Правда, выплевывает в терминал много всякой фигни, что мне совсем не нужно.
Прописывал перенаправление типа '&> /dev/null', но вывод в терминал почему-то остается.
Ну да ладно. Можно и иначе:
from subprocess import run
i = 4
disk = {'path': '/dev/vdb'}
d = f'echo -ne "label:gpt\nsize=512M,type=U\nsize=2G\nsize={i}G,type=S\n+\n" | sfdisk {disk["path"]}'
#i = os.system(d)
r = run(['echo', '-ne', f"label:gpt\nsize=512M,type=U\nsize=2G\nsize={i}G,type=S\n+\n", '|', 'sfdisk', '/dev/vdb'], text=True, capture_output=True)
print(f"Return code: {r}")
###############
Return code: CompletedProcess(args=['echo', '-ne', 'label:gpt\nsize=512M,type=U\nsize=2G\nsize=4G,type=S\n+\n', '|', 'sfdisk', '/dev/vdb'], returncode=0, stdout='label:gpt\nsize=512M,type=U\nsize=2G\nsize=4G,type=S\n+\n | sfdisk /dev/vdb', stderr='')

Ведь прекрасно же! Ни каких ашыпок!
Вот только... Разбиение диска не происходит!
fdisk /dev/vdb -l
Disk /dev/vdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x89562886

Как бы тут и рыбку съесть и в терминал не вывести?
Я делаю что-то не правильно?
Подозреваю, что какая-то незнакомая мне беда с перенаправлением ввода-вывода.
Кстати, если делать через os.system(() то разметка происходит. Просто не получается заглушить вывод в терминал.
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
@HighMan Автор вопроса
from subprocess import run
i = 4
disk = {'path': '/dev/vdb'}
d = f"label:gpt\nsize=512M,type=U\nsize=2G\nsize={i}G,type=S\n+\n"
r = run(['sfdisk', disk['path']], text=True, input=d, capture_output=True)
print(f"Return code: {r}")

Вот так работает как нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы