Python-yad 进度条在 python 3.4 中不起作用,但在 python 2.7 中起作用

标签 python subprocess pexpect yad

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

现在,我面临一个奇怪的错误,我试图显示一个简单的[多]进度条并使用特定值更新进度条,如下所示:

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 
...

最佳答案

重新发布作为答案:

在包装器模块内,写入子进程的 stdin 后调用 p.stdin.flush()

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

关于Python-yad 进度条在 python 3.4 中不起作用,但在 python 2.7 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389530/

相关文章:

python - 递归删除列表中相邻的重复项

python - flask 模板 : nginx cache or serve static assets called in jinja markups

python - 如何使用子进程 check_output 获取子进程的 PID

python - 子进程 block Django View

python - 如何获得 MyPy 的正则表达式模式类型

python - Flask-在2条不同的 route 使用相同的变量?

HPC集群计算机上的python

python - python popen可以捕获子进程的子进程的交互式输出

python - python 中的 ssh 连接句柄 pexpect