2016-08-13 6 views
0

Ich werde versuchen, eine Taste auf meinem RPi zu verbinden, um mplayer zu steuern, der erste Tastendruck startet den Player, und jeder weitere Tastendruck soll einen weiteren Eintrag in der Playliste abspielen . Als minimales Beispiel habe ich folgende Skript auf Linux Mint 18 und Python3.4.3:Python 3.4: Nachdem das popen.communicate() Programm verloren ist

from time import sleep 
from subprocess import Popen, PIPE, DEVNULL 

cmd = ["mplayer", "-shuffle", "-playlist", "/path/to/playlist.m3u"] 

if __name__ == '__main__': 
    first = False 
    p = None 
    i = 0 

    if first == False: # should simulate first button 
     print("player starting") 
     p = Popen(cmd, stdin=PIPE, stdout=DEVNULL) 
     print("player started") 
     first = True 

    while 1: 
     sleep(1) 
     i += 1 
     print(str(i)+ " " +str(first)) 

     if i == 5 and first == True: # should simulate each later button 
      i = 0 
      print("sending keystroke to mplayer") 
      p.communicate(b"\n")[0] # mplayer plays next song, but the program is lost 
      print("sended keystroke to mplayer - never printed") 

Und der Ausgang ist:

player starting 
player started 
1 True 
2 True 
3 True 
4 True 
5 True 
sending keystroke to mplayer 

Und nun einen Neustart der Schleife erwarte ich, aber es fehlt. Debugging hat mir nicht geholfen. Haben Sie Ideen, wie Sie das Problem lösen und in die Schleife zurückkehren können?

Vielen Dank.

+0

[ 'Popen.communicate()'] (https://docs.python.org/3.4/library/subprocess.html#subprocess.Popen.communicate) versucht, Daten von stdout und stderr bis EOF zu lesen und wartet auf die Beendigung des Prozesses. Mit anderen Worten blockiert es bis mplayer beendet wird. –

+0

Vielen Dank für den Hinweis. – immi1988

Antwort

0

ich es mit MPlayer Slave gelöst:

from time import sleep 
from subprocess import Popen 

pathtoControlFile = "/home/immi/mplayer-control" 
cmd = ["mplayer", "-slave", "-input", "file="+pathtoControlFile, "-shuffle", "-playlist", "/media/immi/9A005723005705A3/Musik/playlist.m3u"] 

if __name__ == '__main__': 
    first = False 
    i = 0 

    if first == False:  # initial start 
     print("player starting") 
     p = Popen(cmd) 
     print("player started") 
     first = True 

    while 1: 
     sleep(1) 
     i += 1 
     print(str(i)+ " " +str(first)) 

     if i == 5 and first == True: # each later button 
      i = 0 
      print("sending keystroke to mplayer") 
      with open(pathtoControlFile, "wb+", buffering=0) as fileInput: 
       p = Popen(["echo", "pt_step next"], stdout=fileInput)