Python 连接到子流程标准DIN到管道

Python 连接到子流程标准DIN到管道,python,subprocess,pipe,stdin,Python,Subprocess,Pipe,Stdin,我有一个方法,可以创建一个子流程并将其STDIN连接到匿名管道;这是行不通的。它不会引发任何异常,子流程似乎永远不会读取数据。(子流程是用于在GUI中显示进度条的“zenity”可执行文件) 这个想法是调用方法将是非阻塞的,我可以write()到Screen.progress,并且必须写入子进程的STDIN(zenity)中。(zenity绘制完成条形图,从标准输入中读取值) 框在屏幕上绘制,但screen.progress.write('50')从不更新栏 我做错了什么 编辑: 如果以交互方式

我有一个方法,可以创建一个子流程并将其STDIN连接到匿名管道;这是行不通的。它不会引发任何异常,子流程似乎永远不会读取数据。(子流程是用于在GUI中显示进度条的“zenity”可执行文件)

这个想法是调用方法将是非阻塞的,我可以
write()
Screen.progress
,并且必须写入子进程的STDIN(zenity)中。(zenity绘制完成条形图,从标准输入中读取值)

框在屏幕上绘制,但
screen.progress.write('50')
从不更新栏

我做错了什么

编辑:


如果以交互方式运行,则只要退出python shell,该条就会开始移动。(脉冲)这意味着它只能在python进程退出后读取。

您可能需要刷新文件缓冲区。每次写入后尝试执行
self.progress.flush()

os.fdopen()
的缓冲区大小应为0。使用
rfd=os.fdopen(readp,'r',0)

就是这样!这么简单。我将
fdopen()
更改为使用bufsize为0,它可以在不刷新的情况下工作。谢谢您真的需要手动制作自己的管道吗?为什么不让子流程为您处理这个问题呢。例如
handle=subprocess.Popen('cat',stdin=subprocess.PIPE);write('hello')
这样就行了,从我为子流程查看的代码示例来看,我认为stdin是从args读取到communicate()方法的。谢谢
class Screen(object):
    def __init__(self, display = ":0", bin = '/usr/bin/zenity'):
        self.bin = bin
        os.environ['DISPLAY'] = display
        self.dis = display

    def displayProgress(self, text, pulse = True, title = 'Progess'):
    '''Method to represent the 'zenity --progress' command
    '''
        readp, writep = os.pipe()
        reade, writee = os.pipe()

        rfd = os.fdopen(readp, 'r')
        wfd = os.fdopen(writep, 'w')


        if pulse:
            zenhandle = Popen([self.bin, '--progress',
                                         '--title=%s' % title,
                                         '--auto-close',
                                         '--pulsate'],
                              stdin = rfd)
        else:
            zenhandle = Popen([self.bin, '--progress',
                                         '--title=%s' % title,
                                         '--auto-close'],
                              stdin = rfd)

        self.progress = wfd