2017-09-20 1 views
1

Ich bin ein Musik-Player-System mit omxplayer coding, alles ist fertig, aber ich habe ein Problem, muss ich erkennen, wann die Musik von subprocess.wait() bis zum Ende der abgeschlossen ist Prozess und ich muss Bytes in den Prozess schreiben wie 'p'.encode() zu pausieren,' q'.encode() um zu stoppen etc ... Das Problem ist, dass ich nicht Bytes in einen Subprozess schreiben kann während Warten Sie darauf ... Wenn jemand weiß, wie man das Ende eines Prozesses erkennt und gleichzeitig darauf schreibt, dann sind Sie willkommen!Kann nicht schreiben, während subprocess.wait

Hier ist mein Code:

class MusicPlayer(Thread): 
    def __init__(self, manager, playlist=[]): 
     self.playlist = [] 
     self.index = 0 
     self.process = None 
     self.paused = False 
     self.stopped = False 
     self.manager = manager 
     self.progress_bar = MusicProgressBar(self) 
     self.progress_bar.start() 
     Thread.__init__(self) 
    def run(self): 
     while True: 
      if len(self.playlist) is 0: 
       time.sleep(1) 
       continue 

      self.process = subprocess.Popen(['omxplayer' , '-o' , 'local', self.playlist[self.index].file_url]) 
      self.progress_bar.play(self.playlist[0].file_url) 
      self.paused = False 
      self.process.wait() 
      self.index += 1 
      if self.index >= len(self.playlist): 
       self.index = 0 
    def play(self, playlist): 
     self.playlist = playlist 
     self.index = 0 
    def next(self): 
     if self.process is None: return 
     self.process.stdin.write('q'.encode()) 
     self.process.stdin.flush() 

    def before(self): 
     for i in range(0,2): 
      self.index -= 1 
      if self.index < 0: 
       self.index = len(self.playlist-1) 

    def stop(self): 
     if self.process is None: return 
     self.process.stdin.write('q'.encode()) 
     self.process.stdin.flush() 
     self.stopped = True 

    def pause(self): 
     if self.process is None: return 
     if self.paused: return 
     self.process.stdin.write('p'.encode()) 
     self.process.stdin.flush() 
     self.paused = True 

    def resume(self): 
     if self.process is None: return 
     if not self.paused: return 
     self.process.stdin.write('p'.encode()) 
     self.process.stdin.flush() 
     self.paused = False 

Danke wirklich viel für Ihre Antworten! Mit freundlichen Grüßen, Julien

+0

Werfen Sie einen Blick auf ['Popen.communicate()'] (https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate). – martineau

Antwort

0

Ich denke, diese Zeile

ändern
 self.process.wait() 

zu einer while-Schleife

while self.process.poll() not None: 
    c = stdscr.getch() 
    if c != -1: 
    # check p, q 

Das Polling halten, ob der omxplayer Prozess beendet. Wenn nicht, prüfen Sie, ob eine Taste gedrückt wird.

Verwandte Themen