Как отправить EOF в Python sys.вывод из командной строки? CTRL-D не работает
Я пишу в свой процесс Python из командной строки в unix. Я хочу отправить EOF (или каким-то образом очистить буфер stdin, чтобы Python мог прочитать мои входные данные.)
Если я нажму CTRL-C, я получу KeyboardError.
Если я нажму CTRL-D, программа просто остановится.
Как очистить буфер stdin?
4 ответов:
Control-D не должен заставлять вашу программу "просто останавливаться" - он должен закрывать стандартный вход, и если ваша программа справится с этим должным образом, она вполне может продолжить, если это необходимо!
Например, дано следующее
st.py:import sys def main(): inwas = [] for line in sys.stdin: inwas.append(line) print "%d lines" % len(inwas), print "initials:", ''.join(x[0] for x in inwas) if __name__ == '__main__': main()Мы могли бы увидеть что-то вроде
$ python st.py nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita 3 lines initials: nmc $Если control-D нажата сразу после ввода в третьей строке-программа понимает, что стандартный ввод выполнен, и выполняет необходимую постобработку, все аккуратно и правильно.
Если ваш программа преждевременно выходит на control-D, она должна быть плохо закодирована - как насчет редактирования вашего вопроса, чтобы добавить самую маленькую" плохую " программу, которую вы можете себе представить, чтобы мы могли точно показать вам, как вы идете неправильно?
Если вы используете 'for l в sys.стдин, он буферизован.
Вы можете использовать:
while 1: l = sys.stdin.readline()
Мне кажется, я знаю, что происходит. Вы ударяете
ctrl-D, не ударяяenter. Если вы хотите отправить строку в программу, просто нажмите enter. Если вы нажметеctrl-D, не нажимаяenter, Вы можете снова нажатьctrl-D, и тогда ваша программа должна увидеть строку. В этом случае (дваctrl-Ds подряд) ваша программа не будет видеть новую строку в конце строки.Например, у меня есть скрипт на Python
a.py:import sys for line in sys.stdin: sys.stdout.write('%s' % line)И я исполняю его:
$ python a.pyИ затем введите следующее:
line 1 line 2<ctrl-D><ctrl-D>Программа выведет:
line 1 line 2$
$есть оболочка-подсказка. Вот полная сессия с приведенными выше входными данными:$ python a.py
строка 1
строка 2 строка 1
линия 2$(жирным шрифтом показаны выходные данные программы. Roman-case предназначен для показа того, что я напечатал, без двух
Если это не то, что происходит, вы должны рассказать нам больше о том, что вы делаете.ctrl-Ds)
try: # You might be inside the while-loop foo = raw_input('Spam: ') # Or whatever... except EOFError: print 'And now for something completely different.' sys.exit()
Comments