J'essaie d'implémenter un lecteur radio en utilisant RPi. L'objectif est de configurer une playlist et de commencer à jouer une fois que la playlist est remplie. Les processus du lecteur et de la radio doivent se terminer une fois que le code d'arrêt est exécuté.Sous-processus Python Popen.terminate() toujours bloqué sur wait()
Le processus radio se termine bien mais le processus du lecteur reste toujours en attente même après l'appel terminé. Si le code d'arrêt est appelé à nouveau, puis processus de joueur se termine
choses ont essayé:
- réordonnancement attendre les commandes (lecteur, radio)/(radio, lecteur)
- réordonnancement de la même fin commandes
- kill au lieu de mettre fin à l'IPD se bloque
code du joueur:
while playlist:
player = subprocess.Popen(
["avconv", "-i", "Music/%s" % playlist[0], "-f", "s16le", "-ar",
"22.05k", "-ac", "1", "-"], stdout=subprocess.PIPE)
radio = subprocess.Popen(["./pifm", "-", freq], stdin=player.stdout)
radio.wait()
print "************ exiting from radio :)"
player.wait()
print "************ exiting from player :)"
playlist.pop(0)
player = None
radio = None
Joueur code arythmique (appelé à partir d'un autre thread):
print "************ stop requested"
if radio and radio.poll() is None:
print "************ terminating radio :)"
radio.terminate()
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
Alternative:
Une autre alternative est d'avoir un puits persistant pour la radio et sur le processus de demande pour le joueur
def start_radio():
global radio
radio = subprocess.Popen(["./pifm"...], stdin=subprocess.PIPE)
def play():
global player
while playlist and radio:
player = subprocess.Popen(["avconv"...], stdout=radio.stdin)
player.wait()
playlist.pop(0)
def stop():
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
Mais dans ce cas, l'appel à player.terminate() ferme le lecteur en répétant le dernier paquet sur le processus radio (comme un enregistrement bloqué) . Cet enregistrement coincé joue jusqu'à ce que je démarre un nouveau joueur ou que j'arrête la radio.
essayer 'player.join() joueur' puis '. terminer() '? – ritlew
@ritlew 'player' est un objet Popen et n'a pas de méthode de jointure. – CuriousCat
1- * "Utiliser kill au lieu de terminer bloque le RPi" * - vous devez d'abord résoudre ce problème (cela peut aussi vous permettre de répondre à la question en cours). 2- Vous devriez appeler 'player.stdout.close()' après 'radio = Popen (...)' de sorte que le processus du joueur se termine si le processus radio se termine. – jfs