2016-05-20 6 views
1

Ich benutze Python-Code, der omxplayer startet. Es spielt Lieder und spielt manchmal eine Werbung während des Liedes. In diesem Fall laufen zwei Spieler. Das Problem tritt auf, wenn der omxplayer abläuft. Nach Auszeit kann ich schließen Sie es nicht, so ich bis jetztErhalten Sie eine PID-Nummer eines Prozesses und dann kill es mit Python

os.system("killall -9 omxplayer.bin") 

verwendet haben, ist es in Ordnung, wenn nur ein Lied gespielt wird, aber wenn eine Werbung während eines Liedes und die omxplayer mal aus (nicht beendet ist wisst warum, aber die Auszeit passiert sehr oft) Dieser Befehl tötet beide omxplayer. Es wäre also großartig, wenn ich die PID der Prozesse (omxplayer.bin) in einer Variablen in Python speichern und damit den Prozess beenden könnte. Aber ich würde jede Lösung zu schätzen wissen, die die PID eines bestimmten Prozesses zurückgeben und sie dann aus dem Python-Code löschen kann. Ich habe so viele Dinge bisher probiert. Jeder kann mir dabei helfen?

+2

Um PID zu erhalten [aktivieren Sie diese Option] (http://stackoverflow.com/questions/26688936/python-how-to-get-pid-by-process-name). Prozess durch PID abbrechen [markieren Sie dies] (http://stackoverflow.com/questions/17856928/how-to-terminate-process-from-python-using-pid). –

+0

Danke! Es klappt. :) –

Antwort

1

Eine mögliche Lösung, wie ich sagte:

import os 
import signal 
from subprocess import check_output 

def get_pid(name): 
    return check_output(["pidof", name]) 

def main(): 
    os.kill(get_pid(whatever_you_search), signal.SIGTERM) #or signal.SIGKILL 

if __name__ == "__main__": 
    main() 
+0

Aus irgendeinem Grund funktioniert das Subprozessmodul nicht für mich. Ich habe viele Befehle aus dem Modul ausprobiert, fast alles. Das Programm wirft keinen Fehler. Ich bekomme einfach keine Antwort. Die eingegebenen Befehle verhalten sich so, als ob sie nicht existieren. –

1

würde ich empfehlen psutil verwenden, speziell psutil.process_iter():

>>> # get all PIDs 
>>> psutil.pids() 
[0, 4, 472, 648, 756, ...] 
>>> # but for iteration you should use process_iter() 
>>> for proc in psutil.process_iter(): 
>>>  try: 
>>>   if pinfo.name() == "omxplayer": 
>>>    pinfo.terminate() 
>>>  except psutil.NoSuchProcess: 
>>>   pass 
+0

Es scheint eine gute Lösung. Und wie kann ich die PID des Prozesses bekommen, anstatt sie zu beenden? –

+0

@TiborBalogh Wenn Sie nur die PID wollen, verwenden Sie ['pinfo.pid'] (https://pythonhosted.org/psutil/#psutil.Process.pid). – MilkeyMouse

0

Ich weiß, diese Frage ist alt, aber hier ist das, was ich herauskommen mit, es funktioniert für Java proceses:

zuerst die pid

erhalten

Und dann töten sie pid = getPidByName ("user-access") os.kill (int (pid), signal.SIGKILL)

wie @ Eltete erwähnt.

Für verschiedene Prozesse müssen Sie möglicherweise den Rückgabewert in Argumenten anpassen, je nachdem, welchen Prozess Sie abbrechen möchten. Oder einfach über den Befehl iterieren und töten, wo Sie eine Vorkommen des Namens finden. Dies hauptsächlich, weil "pidof" nicht mit MacOs oder Windows funktioniert.

Verwandte Themen