2016-05-10 41 views
0

也许我在一个问题标题中写了一个奇怪的问题,我试着解释一下。
我正在尝试在基于Linux的系统中执行密码输入(键入时不显示符号)。
我发现了一个功能。为什么使用打印功能的结束参数改变输出时间?

def getchar(): 
    import tty, termios, sys 
    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 
    try: 
     tty.setraw(sys.stdin.fileno()) 
     ch = sys.stdin.read(1) 
    finally: 
     termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
    return ch 

pwd = '' 

print('Type password:', end=' ') # HERE IS THE PROBLEM 

while True: 
    ch = getchar() 
    if ch == '\r': 
     break 
    pwd += ch 

print(pwd) 

如果我不使用end参数,它看起来像: enter image description here

但随着end说法:enter image description here

线 '类型的密码:' 会出现while循环结束后。 这是为什么?我该怎么办?

+0

'sys.stdout.flush()' – zondo

回答

2

默认情况下,sys.stdout行缓冲,这意味着写入它的任何内容都被缓冲直到看到换行符。

由于您用空格替换了标准end='\n',因此没有看到换行符,并且缓冲区未刷新。设置flush=True强制刷新缓冲反正

print('Type password:', end=' ', flush=True) 
+0

像缓冲串并不是一成不变的? – Aero

+0

@航空:这与不变性无关;缓冲区占用机器级别的字节,而不是Python对象(通常像C这样的缓冲区是用C代码处理的)。 –

+0

好的,谢谢。 – Aero