I'm curious, why the code below freezes. When I kill python3 interpreter, "cat" process remains as a zombie. I expect the subprocess will be terminated before main process finished.
When I send manually SIGTERM to cat /dev/zero, the process is correctly finished (almost immediately)
#!/usr/bin/env python3
import subprocess
import re
import os
import sys
import time
from PyQt4 import QtCore
class Command(QtCore.QThread):
#    stateChanged = QtCore.pyqtSignal([bool])
    def __init__(self):
        QtCore.QThread.__init__(self)
        self.__runned = False
        self.__cmd = None
        print("initialize")
    def run(self):
        self.__runned = True
        self.__cmd = subprocess.Popen(["cat /dev/zero"], shell=True, stdout=subprocess.PIPE)
        try:
            while self.__runned:
                print("reading via pipe")
                buf = self.__cmd.stdout.readline()
                print("Buffer:{}".format(buf))
        except:
            logging.warning("Can't read from subprocess (cat /dev/zero) via pipe")
        finally:
            print("terminating")
            self.__cmd.terminate()
            self.__cmd.kill()
    def stop(self):
        print("Command::stop stopping")
        self.__runned = False
        if self.__cmd:
            self.__cmd.terminate()
            self.__cmd.kill()
            print("Command::stop stopped")
def exitApp():
    command.stop()
    time.sleep(1)
    sys.exit(0)
if __name__ == "__main__":
    app = QtCore.QCoreApplication(sys.argv)
    command = Command()
#    command.daemon = True
    command.start()
    timer = QtCore.QTimer()
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), exitApp)
    timer.start(2 * 1000)
    sys.exit(app.exec_())
 
     
     
    