gpt4 book ai didi

python - Python 3 __future__ 模块中 print_function 的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 20:49:20 26 4
gpt4 key购买 nike

我观察到 Python 3.2 中 __future__ 模块的 print_function 有一个奇怪的行为。

以这段代码为例:

from __future__ import print_function
import sys

print('Enter the base path of the images: ', end='')
path = sys.stdin.readline().strip().strip('"')
if len(path) == 0:
print("No path entered")
else:
print(root)
print("\n\nPress ENTER to exit")
exit = sys.stdin.readline()

当脚本运行时,控制台似乎在等待用户按下 ENTER,然后显示第一个 print 语句。
然后输出如下所示:

Enter the base path of the images: No path enteredPress ENTER to exit

Needless to day, displaying an empty prompt to the user leads to a lot of confusion especially since a lot of people are afraid of the black window with white text (Command Prompt).

When the code is changed to this

from __future__ import print_function
import sys

print('\nEnter the base path of the images: ', end='') #line now starts with \n
path = sys.stdin.readline().strip().strip('"')
if len(path) == 0:
print("No path entered")
else:
print(path)
print("\n\nPress ENTER to exit")
exit = sys.stdin.readline()

然后输出如预期(假设我们忽略前面的空行):

Enter the base path of the images: c:\c:\Press ENTER to exit

然而,当代码在 python 2.6 中运行时,第一个代码按预期工作(即它显示 Enter the base path of the images: before waiting to receive input ).

这让我想问:
为什么我需要在 print 函数之前加上 \n 才能在 Python 3.2 中显示输出,而我不需要 \n 在 Python 2.6 中运行时?
会不会是 print_function 在两个版本中的实现方式不同?

最佳答案

您正在看到行缓冲的效果。首先刷新 stdout(使用 sys.stdout.flush() 向后兼容 Python 2):

print('Enter the base path of the images: ', end='')
sys.stdout.flush()

Python 2 中的 print() 函数肯定不同于 Python 3 中的函数(其中 from __future__ import print_function 行实际上没有意义)。在 Python 3 中,I/O 得到了全面检查,stdout 缓冲语义也发生了微妙的变化。在 Python 2 中,sys.stdin.readline() 调用自动刷新 stdout,在 Python 3 中不再是这种情况。

如果您使用 input() 函数而不是直接从 stdin 读取,则根本不需要刷新:

msg = 'Enter the base path of the images: '
try:
# python 2
path = raw_input(msg)
except NameError:
# python 3
path = input(msg)

关于python - Python 3 __future__ 模块中 print_function 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14646839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com