【发布时间】: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