Seite 1 von 1
wie bekomme ich aus der PID ein process handle?
Verfasst: Donnerstag 6. September 2007, 14:38
von BigBo
hallo alle zusammen!
ich habe mir (danke gerolds hilfe

) von einem prozess die pid geholt und möchte nun mit "os.waitpid()" auf beendigung dieses prozesses warten.
Code: Alles auswählen
pid_pid = 0
while (pid_pid == 0):
pid = fileOps.get_current_processes()
for proc in pid.values():
if proc["name"] == "xtop.exe":
# Gefunden
pid_name = proc["name"]
pid_pid = proc["pid"]
break
else:
continue
os.waitpid(pid_pid, 0)
allerdings spuckt mir python folgenden fehler aus:
OSError: [Errno 10] No child processes
laut der "Python Library Reference":
On Windows: Wait for completion of a process given by process handle pid
wie bekomme ich nun aus der pid das process handle?
mfg
BigBo
Verfasst: Donnerstag 6. September 2007, 19:17
von Joghurt
Du hast die PID schon und machst es IMO auch richtig. Ich denke mal, dass du nur auf Prozesse warten kannst, die du selbst gestartet hast, nicht auf fremde.
Verfasst: Donnerstag 6. September 2007, 19:20
von BigBo
shit...aber danke joghurt...lösungsvorschläge wie ich DOCH auf diesen prozess warten kann ? *gg*
Verfasst: Donnerstag 6. September 2007, 19:26
von birkenfeld
Unter Windows geht das IIRC, mit einer Funktion "WaitForSingleObjectEx" oder so ähnlich. Müsste man halt ctypes oder win32api nehmen.
Verfasst: Freitag 7. September 2007, 07:34
von BigBo
wir nähern uns immer mehr ner lösung an

aber auch das geht nicht

wenn ich
verwende kommt mir folgende fehlermeldung:
pywintypes.error: (6, 'WaitForSingleObjectEx', 'The handle is invalid.')
mit
diese fehlermeldung:
WindowsError: [Error 6] The handle is invalid
also wieder meine alte frage...wie bekomme ich aus der pid das handle ???
trotzdem vielen dank an alle...ohne euch wär ich nichtmal soweit gekommen

Verfasst: Freitag 7. September 2007, 08:09
von birkenfeld
Das geht mit OpenProcess und dem Recht SYNCHRONIZE.
Verfasst: Freitag 7. September 2007, 08:19
von BigBo
wenns nur so einfach wär birkenfeld

leider kann ich den prozess nicht selbst starten, der wird von nem andern programm gestartet
gibts ne möglichkeit irgendwie trotzdem an des handle zu kommen ?
Verfasst: Freitag 7. September 2007, 08:23
von birkenfeld
Wer sagt denn, dass OpenProcess einen Prozess startet?
Verfasst: Freitag 7. September 2007, 08:42
von BigBo
@birkenfeld: ne fehlerhafte google suche nach dieser funktion meiner seits hat mir des gesagt

aber jetzt weiss ichs ja

danke
geht aber leider immer noch nicht
mit folgendem code lasse ich mir die pid geben (die funktion get_current_processes stammt von gerold und liefert mir n dictionary der aktuell laufenden prozesse):
Code: Alles auswählen
pid_pid = 0
while (pid_pid == 0):
pid = fileOps.get_current_processes()
for proc in pid.values():
if proc["name"] == "xtop.exe":
# Gefunden
pid_name = proc["name"]
pid_pid = proc["pid"]
break
else:
continue
und hiermit versuch ich das warten zu lösen:
Code: Alles auswählen
pid_handle = win32api.OpenProcess(win32event.SYNCHRONIZE, False, pid_pid)
win32event.WaitForSingleObjectEx(pid_handle, 0, False)
allerdings wartet mir immer noch nichts

laut taskmanager läuft der prozess xtop.exe noch, aber mein pythonscript läuft einfach weiter ohne auf die beendigung von xtop.exe zu warten

Verfasst: Freitag 7. September 2007, 09:58
von Zap
Ich habe die Methode noch nie verwendet, aber der erste
google-hit verrät mir das diese einen int wert zurückliefert.
http://kevin.allenpress.com/docs/python ... _meth.html
Den solltest du vielleicht mal abfangen.
Vielleicht sowas in der Richtung:
Code: Alles auswählen
while win32event.WaitForSingleObjectEx(pid_handle, 0, False) == win32event.WAIT_OBJECT_0:
pass
Oder welcher Wert gerade Sinn macht, ka...
Verfasst: Freitag 7. September 2007, 11:42
von BigBo
JUHUUUUUUUUUUUUUUUUUUUU es funktioniert

:-):-):-):-):-):-)
@Zap ja hatte ich inzwischen auch festgestellt
meine lösung nun insgemsamt:
warten bis prozess gestartet und seine pid holen:
Code: Alles auswählen
pid_pid = 0
while (pid_pid == 0): #wait until process is started
pid = fileOps.get_current_processes()
for proc in pid.values():
if proc["name"] == "xtop.exe": #should be the converter
# found
pid_name = proc["name"]
pid_pid = proc["pid"]
break
else:
continue
warten bis prozess beendet:
Code: Alles auswählen
pid_handle = win32api.OpenProcess(win32event.SYNCHRONIZE, False, pid_pid)
while win32event.WaitForSingleObject(pid_handle, 0) != win32event.WAIT_OBJECT_0:
time.sleep(1)
das time.sleep(1) in der schleife sorgt dafür, das python "passive wartet" und somit nicht die prozessorauslastung in die höhe haut
vielen vielen danke leute...ohne euch wär ich daran hoffnungslos gescheitert
achja...wie markier ich das thema als gelöst?
und was heisst eigentlich "IIRC" ?
Verfasst: Freitag 7. September 2007, 12:46
von Zap
IIRC -> „If I Remember Correctly“ -> „Wenn ich mich richtig erinnere“
Verfasst: Dienstag 11. September 2007, 02:38
von nkoehring
BigBo hat geschrieben:achja...wie markier ich das thema als gelöst?
indem du den ersten Beitrag des Themas editierst und dessen Titel mit einem [GELÖST] oder [SOLVED] versiehst,
Verfasst: Dienstag 11. September 2007, 14:53
von Leonidas
BigBo hat geschrieben:achja...wie markier ich das thema als gelöst?
Gar nicht, du lässt es einfach so wie es ist.