системный.стандартный ввод.readlines () зависает скрипт Python

каждый раз, когда я выполняю свой скрипт Python, он, кажется, висит на этой строке:

lines = sys.stdin.readlines()

что нужно сделать, чтобы исправить/избежать этого?

редактировать

вот что я делаю с lines:

lines = sys.stdin.readlines()
updates = [line.split() for line in lines]

Изменить 2

я запускаю этот скрипт с крючка git, так что есть ли в любом случае вокруг EOF?

4 ответов


это во многом зависит от того, чего вы пытаетесь достичь. Вы могли бы сделать:

for line in sys.stdin:
    #do something with line

конечно, с этой идиомой, а также readlines() метод, который вы используете, вам нужно каким-то образом отправить символ EOF в свой скрипт, чтобы он знал, что файл готов к чтению. (В unix Ctrl-D обычно делает трюк).


Если вы не перенаправляете что-то на stdin Это было бы ожидаемым поведением. Это говорит, чтобы прочитать ввод из stdin (Это будет консоль, с которой вы запускаете скрипт). Он ждет вашего ввода.

посмотреть: "как закончить sys.stdin.readlines() вход?


Я знаю, что это не прямой ответ на ваш вопрос, так как другие уже обратились к проблеме EOF, но обычно то, что я нашел, лучше всего работает при чтении живого вывода из долго жил подпроцесс или stdin-это подход к строке while/if:

while True:
    line = sys.stdin.readline()
    if not line:
       break
    process(line)

в этом случае sys.стандартный ввод.readline () вернет строки текста до возвращается EOF. После EOF, если задано, будет возвращена пустая строка, которая запускает разрыв из цикла. Ля зависание все еще может произойти здесь, пока EOF не предоставляется.

стоит отметить, что возможность обработки "живого вывода", в то время как подпроцесс/stdin все еще работает, требует, чтобы приложение записи очистило его вывод.


Если вы запускаете программу в интерактивном сеансе, то эта строка заставляет Python читать из стандартного ввода (i. e. ваша клавиатура), пока вы не отправите символ EOF ( Ctrl-D (Unix / Mac) или Ctrl-Z (Windows)).

>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']