[英]Python Subprocess stdout PIPE for mplayer processes
我已經使用tkinter編寫了以下代碼作為mplayer的前端。 但是,我一直試圖使用來自mplayer的“ get_time_pos”之類的命令,因為答案非常偶然地寫入了PIPE中。 我的意思是,有時它根本不寫,直到程序關閉時才讀取,有時卻不寫。 但是每次,由於傳入另一個命令(獲取時間pos),即使將暫停切換設置為播放(因為已經暫停),視頻也會暫停。
老實說,我很茫然,不知道如何解決這個問題,甚至不知道如何充分描述問題...
后續行動:我僅通過發布相關代碼部分來修改帖子
from Tkinter import *
from ttk import Frame
from tkFileDialog import askopenfilename, askopenfile
from tkMessageBox import showerror, showinfo
from subprocess import *
from threading import Thread
from Queue import Queue, Empty, LifoQueue
import os, sys
import socket
import select
def command_player(self, comd):
if self.mplayer_isrunning():
try:
self.player_process.stdin.write("%s\r\n"%comd)
self.player_process.stdin.flush()
except :
showerror("Error","Error passing command to mplayer\n%s"%sys.exc_info()[1])
self.player_process = Popen(["mplayer","-fs","-slave","-quiet","-wid",str(winid),self.filenm],stdin=PIPE, stdout=PIPE)
#TRYING TO GET VIDEO POSITION IN TERMS OF % AND THEN PAUSE
self.command_player("get_percent_pos")
output = self.player_process.stdout.readline()
self.command_player("pause")
上面的代碼確實讀取了百分比位置,但是無論如何,它始終使視頻暫停。 如果僅保留暫停命令,則暫停將按預期方式工作(它會切換黑白播放和暫停)
另外,select()部分讓我嘗試了另一種方法,但是由於它不是套接字,因此在Windows上不起作用。 解決子流程輸入/輸出問題的任何其他幫助將不勝感激。
不確定,但我認為問題在於管道已緩沖。 我看到您正在嘗試通過發送換行符並調用flush()在標准輸入方面解決此問題。 也許這還不夠。 嘗試發送8 KB的換行符。
對於readline(),您需要一個行尾字符('\\ n'),但是mplayer通常將其進度信息寫在同一行上(帶有'\\ r')。
由於終端應用程序可以立即打印輸出,因此必須有可能直接(不使用緩沖區)進入和輸出子流程。 它可能涉及將您的進程附加到偽終端設備。 一個起點可能是如何在帶有C的Linux中使用偽終端?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.