您的问题实际上是Eclipse引起的。假设您使用PyDev,我能够重现这个问题。在Eclipse控制台中输入一些内容时,会出现与您的问题描述相同的问题。但是当直接使用Python 3.1.1解释器执行完全相同的脚本时,
inputted
不包括换行符。
我调查了Python源代码,并发现
input()
如果stdin是交互式的(即TTY或提示符,无论您如何称呼它),则使用GNU readline,但必要时会回退到stdin对象的
.readline()
方法。然后,如果
readline
的结果以
\n
结尾,则删除该字符。注意:这里没有CR-LF或LF-CR处理(在回退情况下)!
因此,我编写了这个小脚本来查看实际发生了什么:
import sys
from io import StringIO
for stdin in [sys.stdin, StringIO("test\r\ntest\r\n")]:
sys.stdin = stdin
print("readline returns this: " + repr(sys.stdin.readline()))
inputted = input("Enter in something: ")
print("inputted: " + repr(inputted))
print("inputted is printed like this: --> {0} <--".format(inputted))
首先,它使用普通的stdin(控制台或Eclipse控制台)执行代码,然后使用准备好的stdin包含文本test\r\ntest\r\n
。
尝试在Eclipse中运行脚本-您必须输入两次字符串。结论:在Eclipse控制台中按Enter键将产生CR-LF("\r\n")。在Eclipse控制台中打印“\r”将跳到下一行。
另一方面,在Windows控制台中运行它将产生预期的输出:input()
返回一个没有换行符的字符串,因为(我猜)使用了GNU readline。使用准备好的stdin StringIO("test\r\n")
,input()
结果是“test\r”,就像在Eclipse中一样(尽管未打印为新行)。
希望这一切都有意义……但我仍然不知道这是否是Eclipse的预期行为。