连接到子进程的标准输入以进行管道传输

3 投票
2 回答
1996 浏览
提问于 2025-04-16 19:07

我有一个方法,它创建了一个子进程,并把这个子进程的标准输入(STDIN)连接到一个匿名管道,但这个方法并没有正常工作。它没有抛出任何异常,子进程似乎就是无法读取数据。(这个子进程是一个叫做'zenity'的程序,用来在图形界面上显示进度条)

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

我的想法是,调用这个方法时不会阻塞,这样我就可以用write()方法向Screen.progress写入数据,然后这些数据应该能写入子进程(zenity)的标准输入中。(zenity会绘制一个完成进度条,从标准输入中读取值)

进度条的框在屏幕上显示出来了,但Screen.progress.write('50')却没有更新进度条。

我哪里做错了呢?

补充:

如果我在交互模式下运行,当我退出python命令行时,进度条就开始动了。(在跳动)这意味着它在python进程退出后才读取了某些东西。

2 个回答

1

你可能需要清空文件的缓存。试着在每次写入后执行 self.progress.flush()

1

os.fdopen() 这个函数的缓冲区大小应该设置为0。你可以这样使用:rfd = os.fdopen(readp, 'r', 0)

撰写回答