【问题标题】:Python-yad Progress Bar not working in python 3.4 but works in python 2.7Python-yad 进度条在 python 3.4 中不起作用,但在 python 2.7 中起作用
【发布时间】:2016-02-14 07:47:19
【问题描述】:

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

现在,我遇到了一个奇怪的错误,我正在尝试显示一个简单的 [multi] 进度条并使用这样的特定值更新进度条:

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

【问题讨论】:

  • 尝试发送字节对象而不是字符串,msg.encode()
  • 我不明白....你能举个例子吗...??
  • Python 3 字符串是多字节的,Unicode。如果程序需要单字节字符串,就像 Python 2 使用的那样,那么它将无法处理多字节。这是一个常见的问题。 str.encode() 方法返回一个字节对象,就像 Python 2 字符串一样。您可能还需要修改您的模块,具体取决于您编写它的方式。
  • 所以你的意思是它会变成这样:(str(i)+"% done").encode('utf-8')??
  • 在写入模块内的子进程后尝试添加p.stdin.flush()。你不需要对文本进行编码,因为你使用universal_newlines=True创建它,所以它会接受unicode。

标签: python subprocess pexpect yad


【解决方案1】:

作为答案转发:

在封装模块内部,写入子进程的标准输入后调用p.stdin.flush()

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多