Ваша проблема на самом деле Eclipse. Предполагая, что вы используете PyDev, я смог воспроизвести проблему. При вводе чего-либо в консоль Eclipse проблема возникает, как описано в вашем вопросе. Но при непосредственном выполнении того же самого скрипта с интерпретатором Python 3.1.1, inputted
не включает символ новой строки.
Я исследовал исходный код Python и обнаружил, что input()
использует GNU readline , если stdin является интерактивным (т. Е. TTY или приглашение, как бы вы его не называли), но возвращается к .readline()
метод объекта stdin, если необходимо. Затем, если результат 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 - вы должны дважды ввести строку. Вывод: Нажатие Enter в консоли Eclipse выдаст CR-LF ("\ r \ n"). Печать "\ r" в консоли Eclipse приведет к переходу на следующую строку.
С другой стороны, запуск его в консоли Windows даст ожидаемый результат: input()
возвращает строку без перевода строки в конце, потому что (я думаю) используется GNU readline. С подготовленным stdin StringIO("test\r\n")
результат input()
будет "test \ r", как в Eclipse (хотя и не печатается как новая строка).
Надеюсь, все это имеет смысл ... но я до сих пор не знаю, является ли это ожидаемым поведением Затмения.