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.
[ '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. –
Vielen Dank für den Hinweis. – immi1988