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

wie bekomme ich aus der PID ein process handle?

Beitragvon BigBo » Donnerstag 6. September 2007, 14:38

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
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Donnerstag 6. September 2007, 19:17

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:

Beitragvon BigBo » Donnerstag 6. September 2007, 19:20

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

Beitragvon birkenfeld » Donnerstag 6. September 2007, 19:26

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:

Beitragvon BigBo » Freitag 7. September 2007, 07:34

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

Beitragvon birkenfeld » Freitag 7. September 2007, 08:09

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:

Beitragvon BigBo » Freitag 7. September 2007, 08:19

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

Beitragvon birkenfeld » Freitag 7. September 2007, 08:23

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:

Beitragvon BigBo » Freitag 7. September 2007, 08:42

@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

Beitragvon Zap » Freitag 7. September 2007, 09:58

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:

Beitragvon BigBo » Freitag 7. September 2007, 11:42

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

Beitragvon Zap » Freitag 7. September 2007, 12:46

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:

Beitragvon nkoehring » Dienstag 11. September 2007, 02:38

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,
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 11. September 2007, 14:53

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: r.barrios