Python: использовать подпроцесс для ls постоянно - PullRequest
0 голосов
/ 18 марта 2020

У меня есть скрипт, который записывает кучу новых файлов в каталог. После каждого записываемого файла я хочу напечатать результаты команды 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'), потому что процесс уже завершен и входная труба была закрыта.

Есть мысли, как этого добиться?

1 Ответ

0 голосов
/ 18 марта 2020

Я предлагаю вам попробовать subprocess.run, вот код, который вы можете попробовать,

import subprocess
import time

def check_files():
    result = subprocess.run(["ls"], capture_output=True)
    print(result.stdout.decode('utf-8'))

Для python 2.7:

def check_files():
    result = subprocess.check_output(["ls"])
    print(result.decode('utf-8'))

while True:
    check_files()
    time.sleep(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...