wie bekomme ich aus der PID ein process handle?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

hallo alle zusammen!

ich habe mir (danke gerolds hilfe :D ) 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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

shit...aber danke joghurt...lösungsvorschläge wie ich DOCH auf diesen prozess warten kann ? *gg*
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Unter Windows geht das IIRC, mit einer Funktion "WaitForSingleObjectEx" oder so ähnlich. Müsste man halt ctypes oder win32api nehmen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

wir nähern uns immer mehr ner lösung an :-) aber auch das geht nicht :-( wenn ich

Code: Alles auswählen

win32event.WaitForSingleObjectEx(pid_pid, 0, False)
verwende kommt mir folgende fehlermeldung:
pywintypes.error: (6, 'WaitForSingleObjectEx', 'The handle is invalid.')
mit

Code: Alles auswählen

subprocess.WaitForSingleObject(pid_pid, 0)
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 :D
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das geht mit OpenProcess und dem Recht SYNCHRONIZE.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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 ?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wer sagt denn, dass OpenProcess einen Prozess startet?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

@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 :-(
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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...
BigBo
User
Beiträge: 18
Registriert: Mittwoch 5. September 2007, 13:16
Wohnort: Friedrichshafen
Kontaktdaten:

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 :D

achja...wie markier ich das thema als gelöst?
und was heisst eigentlich "IIRC" ?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

IIRC -> „If I Remember Correctly“ -> „Wenn ich mich richtig erinnere“
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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,
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BigBo hat geschrieben:achja...wie markier ich das thema als gelöst?
Gar nicht, du lässt es einfach so wie es ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten