How to clear stdout in Python subprocess?
Question: this snippet will ping an ip address in windows and get output line each 2
seconds, however, I found there's a very slowly memory increasement of
ping.exe process after run it, if I deploy it to ping 1000 ip parallel, soon
it will cause server hang, I think it may because of stdout buffer, may I know
how to clear the stdout or limit its size? thanks!

    
    
    ...
    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() 
    


Answer: ping is producing many more lines than you're reading due to the 2 second
timeout between reads. I'd move the os.kill call into another thread, and use
the main thread to read every line from `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()
    

