2016-04-07 15 views
0

Ich versuche, alle MP3-Dateien im Hintergrund zu starten, indem ich einen Prozess mit der Multiprocessing-Bibliothek erstellen.Prozess beendet nicht

import os 
import subprocess 
from multiprocessing import Process 

def music_player(): 

    music_folder = "/home/pi/Music/" 
    files = os.listdir(music_folder) 
    for mp3_file in files: 
     print("playing " + mp3_file) 
     p = subprocess.Popen(["omxplayer","-o","local",music_folder+mp3_file], 
          stdout = subprocess.PIPE, 
          stdin = subprocess.PIPE, 
          stderr = subprocess.PIPE) 
     print(p) 
     print(p.poll()) 
     print(p.pid) 
     p.wait() 



p = Process(target = music_player) 
print(p, p.is_alive()) 
p.start() 
print(p.pid) 
print(p, p.is_alive()) 
command = raw_input() 
if(command == "stop"): 
    print("terminating...") 
    p.terminate() 
    print(p, p.is_alive()) 
    print(p.exitcode) 

Nach Eingabe der die Code-Exits Befehl „Stop“, aber die Musik noch läuft und ps auf Ausführen ich sehe 2 Prozess omxplayer die ich dann manuell durch kill <pid> töten müssen, um die Musik Stopp zu machen.

Ich zuvor versucht, mit der Unterprozessbibliothek und den Prozess mit kill() and terminate() töten, aber das gleiche Problem aufgetreten ist.

Antwort

0

Erste Beobachtung, Sie brauchen nicht auf die Multiprozessing Modul für das, was Sie hier machen. Subprozess ist für das Erstellen und Verwalten von Prozessen, die andere Skripte und Programme ausführen werden; multiprocessing dient zum Erstellen und Verwalten von Prozessen, die Code aufrufen, der bereits intern für Ihr (Eltern-) Skript ist.

Ich vermute, dass Sie den Effekt der Pufferung sehen. Zu dem Zeitpunkt, an dem Sie diesen Prozess beenden, ist bereits eine beträchtliche Menge an Musik auf die Hardware gepuffert (oder sogar die OS-Puffer für das Gerät).

Was passiert, wenn Sie das gleiche Programm omxplayer von Shell, aber im Hintergrund zu starten (als & Token an das Ende Ihrer Unix-Shell-Befehlszeile ein Programm in den Hintergrund zu schieben). Dann verwenden Sie den Befehl kill für diesen Prozess und sehen Sie, ob Sie die gleichen Ergebnisse sehen.

+0

Ich laufe 'omxplayer -o local &' und ich höre kein Audio. Beim Ausführen von 'ps' sehe ich die omxplayer-Prozesse, aber' sudo kill 'tötet sie nicht, sie erscheinen immer noch in nachfolgenden' ps'-Befehlen. Wie sonst gehe ich vor, die mp3 - Dateien im Hintergrund abzuspielen und die Ausführung meines restlichen Python - Codes fortzusetzen (das obige ist nur ein Testskript Ich versuche die Musik im Hintergrund laufen zu lassen und sie mit einem Befehl) –

+0

Betrachtet man http://elinux.org/Omxplayer Ich sehe, dass dies ein Konsolenspieler ist, der mit einer Art Keyboard Handling Event Loop geschrieben ist. Wenn Sie es von Ihrer Shell aus starten, wird es wahrscheinlich im Hintergrund über die SIGTTIN- oder SIGTTOUT-Signale gestoppt, die versuchen, auf ihr steuerndes Terminal zuzugreifen. Möglicherweise müssen Sie diese Anwendung unter https://expect.readthedocs.org/en/stable/ (Python pexpect) ausführen, damit der Prozess über ein Pseudoterminal verfügt, um die eigenen Ressourcenanforderungen (ein Terminal) zu erfüllen. –

Verwandte Themen