2015-03-10 4 views
1

Я пытаюсь выполнить операцию копирования файла с помощью dd под Windows. Код прост. Просто откройте команду, используя подпроцесс, и прочитайте stderr. Затем обработайте stderr, чтобы показать ход выполнения операции. Вот пример/простой код, который я пытаюсь выполнить: -Невозможно обработать подпроцесс python stderr на окнах

import time 
import signal 
import subprocess 
import os 

def dd_win(): 
    windd = "dd.exe" 
    in_file = os.path.join("E:", "test-in.iso") 
    out_file = os.path.join("E:", "test-out.iso") 
    parameter1 = "if=" + in_file 
    parameter2 = "of=" + out_file 
    parameter3 = "bs=1M" 
    parameter4 = "--progress" 
    command = [windd, parameter1, parameter2, parameter4] 
    print command 
    dd_process = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, bufsize=0) 

    while dd_process.poll() is None: 
     time.sleep(.1) 
     line = dd_process.stderr.readline() 
     if not line: 
      break 
     print ">>>>>", line.strip() 
    if dd_process.poll() is not None: 
     print "Process finished." 

dd_win() 

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

C:\Users\user\Documents>python test.py 
['dd.exe', 'if=E:test-in.iso', 'of=E:test-out.iso', '--progress'] 
>>>>> rawwrite dd for windows version 0.6beta3. 
>>>>> Written by John Newbigin <[email protected]> 
>>>>> This program is covered by terms of the GPL Version 2. 
>>>>> 
175,882,240 # <--- Problem output line. Unable to assign to other variable for progress calculation 
Process finished. 

На самом деле я не знаю, где число как. Это от stderr или буфера? Если это от stderr, то перед цифрами следует напечатать «>>>>>». Я работаю в Windows 7 и использую версию Windows dd.

Любая помощь приветствуется.

+0

Если вы удаляете операторы печати из своего кода, появляется ли '175,882,240'? Можете ли вы перенаправить stdout и stderr из вашей программы в файлы, чтобы вы могли видеть, какой поток «175,882,240» исходит? –

+0

Если я удалю 'print" >>>>> ", line.strip()' statement, то я не вижу никакого вывода на экране. –

+0

Если вы запустили команду dd в своем терминале, вы видите напечатанную «175,882,240», или это только при ее выполнении в Python? – skrrgwasme

ответ

1

Как обсуждалось в чате, цифры поступают из stderr. Распечатав ascii-индексы каждого символа в строке, мы обнаружили, что конечная строка, возвращаемая readline(), равна \t75,881,728 \r175,882,240 \r\n. Похоже, что \r, встроенный в середину этой строки (какие выходы DD), путает ваш код.

+0

OP может включить 'universal_newlines = True' для обработки' \ r' как новой строки. '\ r' может использоваться для отчета о прогрессе (например, [см., как' reporthook() 'использует' \ r'] (http://stackoverflow.com/a/13895723/4279)) - он может дать указание терминалу переместите курсор в начало строки. – jfs

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