подпроцесс python dd и стандартный вывод

Я использую подпроцесс для создания случайного файла из /dev/random с помощью unix dd. Теперь, если я хочу, чтобы выходные данные dd записывались в файл вместо stdout. так вот код, который я использую,

import subprocess
out_fd = open('test_file','w')
def os_system_dd():
   global out_fd
   out_fd.write("executing the time dd command\n")
   cmd_list = ['time','dd','if=/dev/random', 'of=/home/anand/sys_entropy_random', 'bs=1M' ,'count=5']
   a = subprocess.Popen(cmd_list,stdout=out_fd)
   a.wait()

if __name__ == '__main__':
   os_system_dd()

Это не печатает вывод dd в файл, а вместо этого печатает его в stdout. Это особая функциональность команды dd? Или я что-то упускаю из того, как работает подпроцесс?


person Nandhini Anand Jeyahar    schedule 28.09.2011    source источник
comment
+1 За краткий код и использование списка для построения аргумента. Однако я не могу воспроизвести вашу проблему здесь; ваш код работает нормально. Ваша проблема все еще возникает, если весь код subprocess.Popen(['time','dd','if=/dev/random', 'of=sys_entropy_random', 'bs=1M' ,'count=5']).communicate() ?   -  person phihag    schedule 28.09.2011
comment
Ну, я пробовал это code a = subprocess.Popen(['time','dd','if=/dev/random', 'of=/home/anand/sys_entropy_random', 'bs=1M','count= 5'],stdout=out_fd) code и все равно получаю ту же ошибку. Использование Communicat() может решить мою проблему, но я пытался избежать дополнительной явной записи из python. хотя постараюсь обновить.   -  person Nandhini Anand Jeyahar    schedule 28.09.2011
comment
Ой, я неправильно понял вопрос. Ответил - просто перенаправить stderr вместо stdout.   -  person phihag    schedule 28.09.2011


Ответы (2)


dd выводит отладочную информацию на стандартный вывод, а не на стандартный вывод:

import subprocess
out_fd = open('test_file','w')
def os_system_dd():
   out_fd.write("executing the time dd command\n")
   cmd_list = ['time','dd','if=/dev/random', 'of=/home/anand/sys_entropy_random',
                           'bs=1M' ,'count=5']
   a = subprocess.Popen(cmd_list,stderr=out_fd) # notice stderr
   a.communicate()

if __name__ == '__main__':
   os_system_dd()
person phihag    schedule 28.09.2011

Причина, по которой в файл ничего не записывается, заключается в том, что он записывается в stderr. Перенаправь stderr и получишь результат.

import subprocess
out_fd = open('test_file','w')
def os_system_dd():
   global out_fd
   out_fd.write("executing the time dd command\n")
   cmd_list = ['date'] #Your list
   a = subprocess.Popen(cmd_list,stdout=out_fd, stderr=out_fd)
   a.wait()

if __name__ == '__main__':
   os_system_dd()

Кроме того, сбросить буфер после записи «выполнение времени ...»

person spicavigo    schedule 28.09.2011
comment
shell=True просто замедляет работу кода и делает его более подверженным ошибкам. Почему вы хотите его использовать? - person phihag; 28.09.2011
comment
Виноват. Я пытался добавлять разные вещи, пока это не сработало. Теперь я понимаю, что в его коде не было ничего плохого, кроме перенаправления stderr. Обновляю свой ответ, чтобы отразить это. - person spicavigo; 28.09.2011
comment
@phihag Я не думаю, что замедление хоть как-то заметно. И если командная строка жестко закодирована, то в shell=True нет ничего плохого (за исключением того, что она оставляет немного неприятного запаха). Если бы это была динамическая струна, это было бы действительно преступлением... - person glglgl; 28.09.2011