Как очистить стандартный вывод в подпроцессе Python? - PullRequest
2 голосов
/ 01 сентября 2011

этот фрагмент будет пинговать IP-адрес в Windows и каждые 2 секунды будет получать строку вывода, однако я обнаружил, что после запуска процесса очень медленно увеличивается объем памяти процесса ping.exe, если я скоро разверну его на ping 1000 ip параллельно это приведет к зависанию сервера, я думаю, что это может из-за буфера стандартного вывода, могу ли я узнать, как очистить стандартный вывод или ограничить его размер? спасибо!

...
proc = subprocess.Popen(['c:\windows\system32\ping.exe','127.0.0.1', '-l', '10000', '-t'],stdout=subprocess.PIPE, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) 

while True: 
    time.sleep(2)
    os.kill(proc.pid, signal.CTRL_BREAK_EVENT) 
    line = proc.stdout.readline() 

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

ping производит намного больше строк, чем вы читаете из-за 2-секундного тайм-аута между чтениями.Я бы переместил вызов os.kill в другой поток и использовал бы основной поток для чтения каждой строки из proc.stdout:

import sys, os
import subprocess
import threading
import signal
import time

#Use ctrl-c and ctrl-break to terminate the script/ping

def sigbreak(signum, frame):
    import sys
    if proc.poll() is None:
        print('Killing ping...')
        proc.kill()
    sys.exit(0)

signal.signal(signal.SIGBREAK, sigbreak)
signal.signal(signal.SIGINT, sigbreak)

#executes in a separate thread
def run(pid):
    while True:
        time.sleep(2)
        try: 
            os.kill(pid, signal.CTRL_BREAK_EVENT)
        except WindowsError:
            #quit the thread if ping is dead 
            break

cmd = [r'c:\windows\system32\ping.exe', '127.0.0.1', '-l', '10000', '-t']
flags = subprocess.CREATE_NEW_PROCESS_GROUP
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, creationflags=flags)
threading.Thread(target=run, args=(proc.pid,)).start()

while True:
    line = proc.stdout.readline()
    if b'statistics' in line:
        #I don't know what you're doing with the ping stats.
        #I'll just print them.
        for n in range(4):
            encoding = getattr(sys.stdout, 'encoding', 'ascii') 
            print(line.decode(encoding).rstrip())
            line = proc.stdout.readline()
        print()
0 голосов
/ 01 сентября 2011

Попробуйте ping.py вместо манипулирования с ping.exe

...