Как я могу использовать переданную строку команд с модулем подпроцесса Python? - PullRequest
1 голос
/ 22 мая 2011

Я хочу создать новый пустой диск с помощью скрипта Python в Ubuntu.

В скрипте bash или из командной строки это будет работать:

$echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X

где X - рассматриваемый жесткий диск.

Я попытался перенести это в скрипт Python с помощью модуля подпроцесса следующим образом:

p = subprocess.Popen(cmdString, stdout=subprocess.PIPE, \
                     close_fds=False, stderr=subprocess.PIPE,shell=True)
stdoutAndErr = p.communicate()

, где cmdString точно такой же "echo -e ..." строка выше.

Это не работает, хотя.Вывод - это просто fdisk распечатка опций команды, поэтому ей явно не нравится то, что я посылаю.

Что не так с приведенным выше простым подходом к жизни?

Ответы [ 3 ]

0 голосов
/ 23 мая 2011

Модуль "Включенные батареи" трубы может быть тем, что вы ищете.У Дуга Хеллмана есть хорошая статья о том, как использовать ее, чтобы получить то, что вы хотите.

0 голосов
/ 18 апреля 2017

На самом деле вы должны использовать две трубы, вход второй трубы будет выходом первой, так что вот что нужно сделать:

 p=subprocess.Popen(['printf','n\np\n1\n\n\nw\n'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 p1=subprocess.Popen(['fdisk','/dev/X'],stdin=p.stdout, stderr=subprocess.PIPE, stdout= subprocess.PIPE).wait()

Бонус: обратите внимание на wait (), таким образом, ваш скрипт будет ожидать завершения работы fdisk.

0 голосов
/ 22 мая 2011

Вы не можете передать сложную командную строку в функцию Popen (). Он принимает список в качестве первого аргумента. Модуль shlex , особенно функция split (), очень вам поможет, а в документации к подпроцессу 1004 * есть несколько примеров, в которых он используется.

Итак, вы хотите что-то вроде:

import shlex, subprocess
command_line = 'echo -e "n\np\n1\n\n\nw\n" | sudo fdisk /dev/X'
args = shlex.split(command_line)
p = subprocess.Popen(args) # Success!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...