Вопрос по readlines, hang, python, stdin – sys.stdin.readlines () вешает скрипт Python

11

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

lines = sys.stdin.readlines()

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

EDIT

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

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

EDIT 2

Я запускаю этот сценарий с помощью git hook, так есть ли вообще EOF?

Обратите внимание, что readlines () требует EOF, прежде чем он вернется. Это не произойдет, пока EOF не будет передан в stdin через исполняемое приложение / оболочку. Jason Mock

Ваш Ответ

4   ответа
3

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

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

В этом случае sys.stdin.readline () будет возвращать строки текстаbefore EOF возвращается. Как только EOF, если дано, будет возвращена пустая строка, которая вызывает разрыв цикла.hang может все еще происходить здесь, пока EOF не предоставлен.

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

Он работает построчно для меня на Linux ...
Любопытно, что это работает для вас, потому что я могу показать вышеупомянутое поведение по крайней мере до Python 2.6.6 для обоих объектов sys.stdin и подпроцесса, и я не единственный, кто обнаружил, что это так:stackoverflow.com/questions/2804543/…, Не поймите меня неправильно, я с радостью признаю, что могу ошибаться, потому что предпочел бы более простой синтаксис.
Я только что заметил, что следующий вопрос был добавлен к вопросу выше: для file.readline () против для строки в файле см.bugs.python.org/issue3907 (вкратце: он работает на Python3; используйте io.open () на Python 2.6+)
Я полностью согласен с утверждением, что ответ @ mgilson является более питоническим. Я просто не нашел, что он очень удобен для «живого вывода», такого как получение информации о состоянии из долго работающего приложения, чтобы сообщить о состоянии обратно пользователю, так как он требует, чтобы объект типа файла создавал EOF перед циклом начинает обработку. В моем примере вызов readline () даст мне строки текста перед возвратом EOF. EOF требуется только прерваться, дав мне пустую строку. При этом я, вероятно, мог бы улучшить свое описание, потому что это не очень понятно.
Я думаю, что ответ @ mgilson будет работать лучше; это будет работать, но это более "Pythonic" путь
2

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

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

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

Увидеть:& quot; Как закончитьsys.stdin.readlines() input?

14

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

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

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

@mgilson По сути, он просто запускает скрипт python автоматически после коммита. Bo A
@JasonMock - Да, я это понимаю (вот почему я говорю «так, чтобы он знал, что файл читается для чтения»).
Я запускаю этот сценарий с помощью git hook, так есть ли вообще EOF? Bo A
@BoA - это имеет смысл, но почему вы не можете нажать Ctrl-D? Откуда ваш скрипт получает информацию?
@BoA - Извините, я ничего не знаю о перехватчиках git, хотя кажется, что если ваша программа читает из канала, она должна просто работать.

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