On Mon, 7 Mar 2005 10:06:01 -0500, Rogelio Flores <[EMAIL PROTECTED]> wrote: > Using win32process.CreateProcess, I can get the process handle/pid of > a process I launch. Now this process launches other processes and they > in turn launch other processes without using CreateProcess (so I don't > have their pids), to the point where I know there are at least two > levels of parent-child processes. Can I get the pids of these > child/grandchild processes from the parent pid? Alternatively, can I > kill the parent pid and all its children along with it? > > I've tried creating the process with win32con.CREATE_NEW_PROCESS_GROUP > and other combinations of flags/arguments but I'm never able to kill > but the parent process (all the children are left running) and I > cannot find a way to get the children's pids from the parent pid or > handle. It seems that win32pdhutil.py has a way to browse through > process trees, but I'm not able to figure out how (using > python2.0/win32all144). Is this possible, and if so, how? > > Thanks, > > -- > Rogelio >
OK, I found a solution, using win32pdhutil.ShowAllProcesses() as a template, I can now get all the processes' pids and their parent pids. The following code snippet prints a table with these three colums: Process Name | PID | Parent PID ----------------- begin code ------------ import win32pdh object = 'Process' items, instances = win32pdh.EnumObjectItems(None, None, object, win32pdh.PERF_DETAIL_WIZARD) instance_dict = {} for instance in instances: try: instance_dict[instance] = instance_dict[instance] + 1 except KeyError: instance_dict[instance] = 0 for instance, max_instances in instance_dict.items(): for inum in xrange(max_instances+1): hq = win32pdh.OpenQuery() hcs = [] for item in ['ID Process', 'Creating Process ID']: path = win32pdh.MakeCounterPath((None,object,instance, None,inum,item)) hcs.append(win32pdh.AddCounter(hq,path)) win32pdh.CollectQueryData(hq) print "%-15s\t" % (instance[:15]), for hc in hcs: type,val=win32pdh.GetFormattedCounterValue(hc,win32pdh.PDH_FMT_LONG) print "%5d" % (val), win32pdh.RemoveCounter(hc) print win32pdh.CloseQuery(hq) ---------- end code --------------- All I needed was to realize that one of the "items" returned by win32pdh.EnumObjectItems() is 'Creating Process ID', which is the parent pid of a given process. -- Rogelio _______________________________________________ Python-win32 mailing list Python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32