2015-07-20 4 views
-1

Код:Невозможно выполнить команду дд с помощью POPEN в питона

from subprocess import PIPE, Popen 
op = Popen("lsblk", shell=True, stdout=PIPE).stdout.read() 
print op 
a = raw_input("Enter Path of Device to be copied : ",) 
b = raw_input("Enter new name for Image : ",) 
print a+b 
op=Popen("dd if="+a+" of="+b+" bs=512").stdout.read() 
print op 
op = Popen("fls "+b+"|grep "+c, shell=True, stdout=PIPE).stdout.read() 
print op 
ar = op.split(" ") 
d = ar[1] 
op = Popen("istat "+b+" "+d, shell=True, stdout=PIPE).stdout.read() 
print op 
e = raw_input("Enter new filename") 
op = Popen("icat "+b+" "+d+" >> "+e, shell=True, stdout=PIPE).stdout.read() 
print op 
op = Popen("gedit "+e, shell=True, stdout=PIPE).stdout.read() 
print op 

Ошибка:

Traceback (most recent call last): 
    File "a3.py", line 8, in <module> 
    op=Popen("dd if="+a+" of="+b+" bs=512").stdout.read() 
    File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ 
    errread, errwrite) 
    File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child 
    raise child_exception OSError: [Errno 2] No such file or directory 

Пожалуйста, помогите, я не знаком с subprocess.Popen и я новичок в программировании.

+0

Выполнение 'dd' с использованием произвольного ввода пользователем для ввода имен входных и выходных файлов является рискованным. По крайней мере, вы должны напечатать аргументы и заставить пользователя подтвердить, что источник и назначение _really_, что они хотят. Кроме того, использование блока размером 512 байт довольно медленное. Попробуйте 64k; более крупные размеры могут быть немного быстрее, в зависимости от вашего оборудования. –

ответ

0
Popen(["command", "-opt", "value", "arg1", "arg2" ...], stdout=PIPE) 

Вы не используете функцию Popen правильно. Вот небольшой пример, учитывая сценарий:

op = Popen(["dd", "if="+a, "of="+b, "bs=512"], stdout=PIPE) 

Вы Шоуда взглянуть на документацию подпроцесса (help(subprocess) в качестве переводчика)

+0

Да, это исправлено. – user3430238

+0

Кстати, спасибо за редактирование. – user3430238

+0

@FunySayu, но я думаю, что мы можем использовать функцию Popen() без указания массива вместо команды –

0

Вы бы лучше передавая список аргументов, если вы хотите, чтобы трубы вы можете использовать Popen перенаправив стандартный вывод одного процесса на стандартный ввод другой, если вы хотите видеть только выход использовать check_output и перенаправить стандартный вывод в файл передать объект файла на стандартный вывод, что-то вроде следующего:

from subprocess import check_output,check_call, Popen,PIPE 

op = check_output(["lsblk"]) 
print op 
a = raw_input("Enter Path of Device to be copied : ",) 
b = raw_input("Enter new name for Image : ",) 
print a + b 
# get output 
op = check_output(["dd", "if={}".format(a), "of={}".format(b), "bs=512"]) 
print op 
# pass list of args without shell=True 
op = Popen(["fls", b], stdout=PIPE) 
# pipe output from op to grep command 
op2 = Popen(["grep", c],stdin=op.stdout,stdout=PIPE) 
op.stdout.close() 
# get stdout from op2 
d = op.communicate()[0].split()[1] 

op = check_output(["istat",b, d]) 
print op 
e = raw_input("Enter new filename") 
# open the file with a to append passing file object to stdout 
# same as >> from bash 
with open(a, "a") as f: 
    check_call(["icat", b], stdout=f) 

# open file and read 
with open(e) as out: 
    print(out.read()) 

Я не где c исходит из того, что вам нужно убедиться, что он определен где-то, check_call и check_output поднимут CalledProcessError для любого ненулевого статуса выхода, чтобы вы могли захотеть поймать это с помощью try/except, и поэтому все, что подходит, если возникает ошибка.

Ваш код выходит из строя при первом вызове Popen, когда вы передаете строку без shell=True, вам необходимо передать список аргументов, как в приведенном выше коде, обычно передавая список аргументов без использования shell = True, будет лучший подход, особенно при вводе данных от пользователя.

+0

Я неправильно использовал команду. – user3430238

+0

См. Первый ответ, который он правильно объясняет – user3430238

+1

@ user3430238, объясняет, что правильно? Я покажу вам, как избежать shell = True и на самом деле правильно написать код. Взятие ввода от пользователя и использование shell = True - ужасная идея, почему вы вызываете gedit, когда можете прочитать файл с помощью python? –

Смежные вопросы