Python-yad Progress Bar在python 3.4中不起作用,但在python 2.7中工作

时间:2016-02-14 07:47:20

标签: python subprocess pexpect yad

我为interface程序创建了一个python yad。代码基本上是这样做的,它生成一个字符串,使用pythons yad和/或subprocess模块传递给pexpect程序并执行它

现在,我面临一个奇怪的错误,我试图显示一个简单的[多]进度条,并用这样的某个值更新栏:

import yad, time

yad = yad.YAD()

x = yad.Progress(autoclose=True) # yad.MultiProgress(autoclose=True)

for i in range(0,105,5):
  print(i)
  x(i,msg=str(i)+"% done")
  time.sleep(0.5)

问题是,在python 2.7中,它工作正常(更新栏,并在病房后关闭),但是当谈到python 3.4时,它不起作用(显示栏,但不更新,即使for循环打印数字。)

我试图弄清楚我的界面有什么问题。这些函数是以这样的方式编写的,它应该更新吧,但由于某种原因它不能在python 3.4中工作。

请帮我解决这个问题。我无法弄清楚错误的位置。

编辑:x是我们调用yad.Progress()时作为输出返回的函数。使用x,我们可以为yad写一些标准输入。代码的shell等价物是这样的:

yad --progress --auto-close
> 5
> # 5% done 
...

2 个答案:

答案 0 :(得分:2)

重新作为答案:

在包装器模块内部,在写入子进程'之后调用p.stdin.flush()。标准输入。

在Python 2中,默认是创建没有任何缓冲的Popen管道(bufsize subprocess.Popen参数默认为0)。这意味着您编写的任何数据都会立即发送到子流程。在Python 3中,缓冲是默认值(bufsize默认为-1,这意味着默认缓冲区大小)。因此,出于性能原因,数据存储在内存中,直到缓冲区填满或者调用flush。

答案 1 :(得分:0)

您可以使用print("{}/100".format(k), "\r", end="")取消打印最后一个%,然后打印更新的进度。