Как перенаправить вывод команды оболочки на вход скрипта Python? - PullRequest
16 голосов
/ 12 декабря 2011

Это, наверное, что-то действительно простое, но я не могу найти хорошее решение для этого. Мне нужно написать скрипт Python, который может принимать входные данные из канала, как это:

$ some-linux-command | my_script.py

как то так:

cat email.txt | script.py

Или он будет просто передан моим файлом .forward напрямую из sendmail. Это означает, что входной файл может быть чем-то относительно большим, если в нем есть вложение, и, вероятно, это будет электронное письмо, позже мне придется поместить в базу данных отправителя, тему и т. Д., Но я написал сценарии базы данных в Python, так что часть будет в порядке. Основная проблема заключается в том, как захватить данные, поступающие из канала.

Ответы [ 2 ]

24 голосов
/ 12 декабря 2011

Используйте sys.stdin для чтения ввода. Пример:

Пример содержимого s.py:

import sys
data = sys.stdin.readlines()
print data

- Бег:

    user@xxxxxxx:~$ cat t.txt
    alpha
    beta
    gamma

    user@xxxxxxx:~$ cat t.txt | python ./s.py
    ['alpha\n', 'beta\n', 'gamma\n']

Вы также можете сделать скрипт Python как скрипт оболочки, используя этот Шебанг:

#!/usr/bin/env python

и изменение разрешения на 'a + x'

 user@xxxxxxx:~$ cat t.txt |  ./s.py
 ['alpha\n', 'beta\n', 'gamma\n']
3 голосов
/ 12 декабря 2011

чтение из sys.stdin, который является файлом, подобным объекту

...