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

Причина состоит в том, что все методы, определенные в интерфейсе, абстрактны, объявляете ли Вы явно тот модификатор. Абстрактный статический метод не является допустимой комбинацией модификаторов, так как статические методы не в состоянии быть переопределенными.

относительно того, почему интерфейсы позволяют статические поля. У меня есть чувство, которое нужно считать "функцией". Единственная возможность, о которой я могу думать, состояла бы в том, чтобы сгруппировать константы, которыми будут интересоваться реализации интерфейса.

я соглашаюсь, что непротиворечивость была бы лучшим подходом. Никаким статическим участникам нельзя разрешить в интерфейсе.

5
задан Joseph Turian 12 December 2009 в 03:54
поделиться

3 ответа

Если вы используете 'for l in sys.stdin', он буферизуется.

Вы можете использовать:

  while 1:
     l = sys.stdin.readline()
2
ответ дан 18 December 2019 в 09:50
поделиться

Control-D should NOT make your program "just stop" -- it should close standard input, and if your program deals with that properly, it may perfectly well continue if it needs to!

For example, given the following 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()

we could see something like

$ 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
$ 

if the control-D is hit right after the enter on the third line -- the program realizes that standard input is done, and performs the needed post-processing, all neat and proper.

If your program prematurely exits on control-D, it must be badly coded -- what about editing you question to add the smallest "misbehaving" program you can conceive of, so we can show you exactly HOW you're going wrong?

12
ответ дан 18 December 2019 в 09:50
поделиться

Думаю, я знаю, что происходит. Вы нажимаете ctrl-D , не нажимая , введите . Если вы хотите отправить в программу строку, просто нажмите Enter. Если вы нажмете ctrl-D , не нажав , введите , вы можете снова нажать ctrl-D , и тогда ваша программа должна увидеть строку. В этом случае (два ctrl-D подряд) ваша программа не увидит новую строку в конце строки.

Например, скажем, у меня есть сценарий 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
Вы нажимаете ctrl-D , не нажимая , введите . Если вы хотите отправить в программу строку, просто нажмите Enter. Если вы нажмете ctrl-D , не нажав , введите , вы можете снова нажать ctrl-D , и тогда ваша программа должна увидеть строку. В этом случае (два ctrl-D подряд) ваша программа не увидит новую строку в конце строки.

Например, скажем, у меня есть сценарий 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
Вы нажимаете ctrl-D , не нажимая , введите . Если вы хотите отправить в программу строку, просто нажмите Enter. Если вы нажмете ctrl-D , не нажав , введите , вы можете снова нажать ctrl-D , и тогда ваша программа должна увидеть строку. В этом случае (два ctrl-D подряд) ваша программа не увидит новую строку в конце строки.

Например, скажем, у меня есть сценарий 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
Если вы нажмете ctrl-D , не нажав , введите , вы можете снова нажать ctrl-D , и тогда ваша программа должна увидеть строку. В этом случае (два ctrl-D подряд) ваша программа не увидит новую строку в конце строки.

Например, скажем, у меня есть сценарий 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
Если вы нажмете ctrl-D , не нажав , введите , вы можете снова нажать ctrl-D , и тогда ваша программа должна увидеть строку. В этом случае (два ctrl-D подряд) ваша программа не увидит новую строку в конце строки.

Например, скажем, у меня есть сценарий 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
s скажем, у меня есть сценарий 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$

$ is приглашение оболочки. Вот полный сеанс с указанными выше данными:

$ python a.py
s скажем, у меня есть сценарий 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$

$ is приглашение оболочки. Вот полный сеанс с указанными выше данными:

$ python a.py
строка 1
строка 2 строка1
строка 2 $

( Полужирным шрифтом показан вывод программы. Римский регистр для отображения того, что я набрал, без двух ctrl-D s)

Если это не то, что происходит, вам нужно рассказать нам больше о том, что вы делаете.

2
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: