Как отправить EOF в Python sys.вывод из командной строки? CTRL-D не работает



Я пишу в свой процесс Python из командной строки в unix. Я хочу отправить EOF (или каким-то образом очистить буфер stdin, чтобы Python мог прочитать мои входные данные.)



Если я нажму CTRL-C, я получу KeyboardError.



Если я нажму CTRL-D, программа просто остановится.



Как очистить буфер stdin?

617   4  

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

    Ничего не найдено.