У меня есть скрипт, который записывает кучу новых файлов в каталог. После каждого записываемого файла я хочу напечатать результаты команды ls. Проблема заключается в том, что если я вызываю
import subprocess
p = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
print ''.join(p.stdout.readlines())
, то в конечном итоге (после записи большого количества файлов) возникает ошибка «[OSError: [Errno 12] не может выделить память» », выдаваемая строкой
p = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
потому что подпроцесс вызывает внутренний вызов os.fork (), что удваивает объем используемой памяти.
Как предполагает другое переполнение стека ({ ссылка }), мы должны быть в состоянии исправить это, инициализируя один объект Popen в начале скрипта, а затем порождая дочерние процессы по мере необходимости , Однако, когда я делаю
p = subprocess.Popen(['ls'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
p.stdin.write('ls')
print p.stdout.readlines()
«IOError: [Errno 32] Broken pipe» генерируется в первом p.stdin.write ('ls'), потому что процесс уже завершен и входная труба была закрыта.
Есть мысли, как этого добиться?