Hello,

i am trying to write a class, which starts a application and this application run other applications. My class has a start and stop-method. The stop method also stop the child-processes of my started application.

At botton, i added a testclass, which represents my class. I am starting cmd.exe and this starts a notepad.exe. All is running inside a Thread. On calling my stop method, i search all childprocesses of my cmd.exe with help of WMI and terminate these PIDs. The terminate method of subprocess only terminate the "main"-process. All child-processes will remain.

All hints to resolve my issue are welcome.

best Regards,
Steffen


#----------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------

from subprocess import PIPE, Popen
import thread
import time
import logging
import os
import win32api
import pythoncom
import win32con
from wmi import WMI

class MyClass(object):

    def __init__(self):
        self.name = __name__
        self.process = None
        self.cmd = None
        self.PID = None
        self.returncode = None
        self.runtime = -1

        self.WMI_RUN = False
        self.WMI = None
#---------------------------------------------------------------------------
    def __startCommand(self):
        logging.debug("starting COMMAND")
        self.startTime = time.time()

        # start-cmd for starting TiscCenter
self.cmd = '"{executable}" -cmd /k {argument}'.format(executable=os.environ['ComSpec'],argument=r'c:/windows/system32/notepad.exe')


        logging.debug("starting command: {0}".format(self.cmd))
        self.process = Popen(self.cmd, stdout=PIPE, stderr=PIPE)
        self.PID = self.process.pid
        self.std_out, self.std_err = self.process.communicate()

        self.returncode = self.process.returncode
        endTime = time.time()
        self.runtime = endTime - self.startTime

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------
    def start(self):

        try:
            thread.start_new_thread(self.__startCommand, ())
        except BaseException, err:
            print(err)
#---------------------------------------------------------------------------

#---------------------------------------------------------------------------
    def stop(self):
        if self.process:
            self.process.terminate()
        else:
            logging.error("nothing to stop")
#---------------------------------------------------------------------------


#---------------------------------------------------------------------------
    def kill(self):

        print("Interface-count:",pythoncom._GetInterfaceCount())
        pythoncom.CoInitialize()
        try:
            ProcessList = []
            childList = []
            for process in WMI().Win32_Process():
if (process.ParentProcessId == self.PID) and (process.ProcessId != self.PID):
                    ProcessList.append(process.ProcessId)

            if ProcessList:
                for processId in ProcessList:
                    childList.append(processId)

            childList.append(self.PID)
            print("PID-List:",childList)


            for pid in childList:
                try:
handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, False, pid)
                except BaseException, err:
                    logging.exception(err)
                else:
                    try:
                        win32api.TerminateProcess(handle, 0)
                        win32api.CloseHandle(handle)
                    except BaseException, err:
                        logging.exception(err)
        except BaseException, err:
            logging.exception(err)

        finally:
            pythoncom.CoUninitialize()
            print("Interface-count:",pythoncom._GetInterfaceCount())
#---------------------------------------------------------------------------

if __name__ == '__main__':
    logging.basicConfig(
        level = logging.DEBUG,
        format = "[%(levelname)s] %(asctime)s : %(message)s",
    )

    a = MyClass()
    a.start()

    time.sleep(2.0)

    a.kill()


#----------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------
example output:
#----------------------------------------------------------------------------------------
[DEBUG] 2012-01-24 11:38:16,525 : starting COMMAND
[DEBUG] 2012-01-24 11:38:16,529 : starting command: "C:\Windows\system32\cmd.exe" -cmd /k c:/windows/system32/notepad.exe
('Interface-count:', 4)
('PID-List:', [12892, 13876])
('Interface-count:', 19)
Win32 exception occurred releasing IUnknown at 0x048fd870
Win32 exception occurred releasing IUnknown at 0x048fd808
Win32 exception occurred releasing IUnknown at 0x048f9238
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to