用于mplayer进程的Python子进程标准管道

用于mplayer进程的Python子进程标准管道,python,subprocess,mplayer,Python,Subprocess,Mplayer,我使用tkinter编写了以下代码作为mplayer的前端。但是,我一直在尝试使用mplayer中的“get\u time\u pos”等命令,因为答案偶尔会写入管道中。我的意思是,有时候,它根本不写,直到程序关闭才被读取,有时候它会。但是,每次视频都会暂停,即使由于传递了另一个命令(get time pos),暂停的切换被设置为播放(因为它已经暂停) 老实说,我不知所措,不知道如何解决这个问题,甚至不知道如何充分描述这个问题 后续:我只发布相关的代码部分来修改帖子 from Tkinter i

我使用tkinter编写了以下代码作为mplayer的前端。但是,我一直在尝试使用mplayer中的“get\u time\u pos”等命令,因为答案偶尔会写入管道中。我的意思是,有时候,它根本不写,直到程序关闭才被读取,有时候它会。但是,每次视频都会暂停,即使由于传递了另一个命令(get time 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")
上面确实读取了百分比位置,但无论发生什么情况,它始终保持视频暂停。如果我只保留pause命令,暂停将按预期工作(它将切换b/w播放和暂停)

另外,select()部分是我尝试的另一种方式,但它在windows上不起作用,因为它不是套接字。
如果您能为解决子流程输入/输出问题提供更多帮助,我们将不胜感激。

不确定,但我认为问题在于管道被缓冲了。我看到您正试图通过发送换行符和调用flush()在stdin端解决这个问题。也许这还不够。尝试发送8KB的换行符

对于readline(),您需要一个行尾字符('\n'),但mplayer通常将其进度信息写入同一行(带'\r')

由于终端应用程序可以立即打印输出,因此必须能够直接(无缓冲区)进入和输出子流程。它可能涉及将进程附加到伪终端设备。起点可能是
不确定,但我认为问题在于管道被缓冲了。我看到您正试图通过发送换行符和调用flush()在stdin端解决这个问题。也许这还不够。尝试发送8KB的换行符

对于readline(),您需要一个行尾字符('\n'),但mplayer通常将其进度信息写入同一行(带'\r')

由于终端应用程序可以立即打印输出,因此必须能够直接(无缓冲区)进入和输出子流程。它可能涉及将进程附加到伪终端设备。起点可能是

你可以。不要转储所有代码,谢谢,但是tkinter中的createfilehandler()只用于在GUI中显示标准输出。我不想那样。使用线程和队列从stdout异步读取的其余部分,我已经尝试过了。我想用python为mplayer制作一个工作的前端是不可能的。你知道你可以在回调中做其他事情。此外,您的示例无法运行。阅读我提供的链接。我之前给出了一个可运行的示例。你说太长了。然后,我发布了代码片段以显示我在做什么。它显然不会运行。我是否应该重写代码,使其“最小化”,同时保持其工作状态,然后将其发布到此处?我认为这不值得努力。我还没有得到关于管道读写问题的具体答案。是的。你的例子应该是最小的和完整的。这取决于你是否想帮助别人来帮助你。而且
createfilehandler
也适用于写作。不要转储所有代码,谢谢,但是tkinter中的createfilehandler()只用于在GUI中显示标准输出。我不想那样。使用线程和队列从stdout异步读取的其余部分,我已经尝试过了。我想用python为mplayer制作一个工作的前端是不可能的。你知道你可以在回调中做其他事情。此外,您的示例无法运行。阅读我提供的链接。我之前给出了一个可运行的示例。你说太长了。然后,我发布了代码片段以显示我在做什么。它显然不会运行。我是否应该重写代码,使其“最小化”,同时保持其工作状态,然后将其发布到此处?我认为这不值得努力。我还没有得到关于管道读写问题的具体答案。是的。你的例子应该是最小的和完整的。这取决于你是否想帮助别人来帮助你。而且
createfilehandler
也适用于写作。不要转储所有代码,谢谢,但是tkinter中的createfilehandler()只用于在GUI中显示标准输出。我不想那样。使用线程和队列从stdout异步读取的其余部分,我已经尝试过了。我想用python为mplayer制作一个工作的前端是不可能的。你知道你可以在回调中做其他事情。此外,您的示例无法运行。阅读我提供的链接。我之前给出了一个可运行的示例。你说太长了。然后,我发布了代码片段以显示我在做什么。它显然不会运行。我是否应该重写代码,使其“最小化”,同时保持其工作状态,然后将其发布到此处?我认为这不值得努力。我还没有得到关于管道读写问题的具体答案。是的。你的例子应该是最小的和完整的。这取决于你是否想帮助别人来帮助你。和
createfilehandler
也适用于编写。相关:相关:相关: