我正在使用pexpect
自动执行安装程序,效果很好。但是,我想用某种pexpect.interact()
替换stdout
,这将使我能够跟踪安装程序的进度条:
Please wait while Setup installs on your computer.
Installing
0% ______________ 50% ______________ 100%
#########################################
----------------------------------------------------------------------------
Setup has finished installing on your computer.
View readme file [Y/n]: n
[Errno 5] Input/output error
源代码如下:
## A bunch of informations being given to the installer above
## Do you want install? y
child.sendline('y')
## now I keep tracking of the installation bar progress ...
child.interact()
## View readme file [Y/n]: n
child.sendline('n')
因此最后一部分是手动完成的,一旦安装完成,我就无法使用
child.interact()
。我该怎么做?
最佳答案
我必须做一次相同的事情。问题是默认情况下,事情在行缓冲模式下工作。这是我的解决方法:
在创建child
(我假设这是pexpect.spawn
)之后,您可以将属性child.logfile
设置为某种值-不必从字面上看是日志文件,它可以是任何文件句柄。您可以将其设置为sys.stdout
,但以无缓冲模式打开此文件句柄。
工作示例:
#!/usr/bin/env python
import pexpect
import sys
import time
import os
def potato():
for i in range(20):
time.sleep(0.1)
sys.stdout.write(str(i))
sys.stdout.flush()
sys.stdout.write('bye\n')
if __name__ == '__main__':
if sys.argv[-1] == 'potato':
potato()
else:
child = pexpect.spawn(__file__ + ' potato')
child.logfile = os.fdopen(sys.stdout.fileno(), 'w', 0)
child.expect('bye')
关于python - 在pexpect中将输出显示到终端-Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21239338/