如何将Shell命令的输出重定向到Python脚本的输入?

17

这可能是非常基本的问题,但我找不到一个好的解决方案。 我需要编写一个Python脚本,可以接受来自管道的输入,就像这样:

$ some-linux-command | my_script.py

类似这样:

cat email.txt | script.py

否则它将直接通过我的.forward文件从sendmail中传输。这意味着如果它有附件,输入文件可能相对较大,并且它很可能是一封电子邮件,稍后我将不得不将发件人、主题等放入数据库中,但我已经用Python编写了数据库脚本,所以那部分没问题。 主要问题是如何捕获通过管道流动的数据。


你为什么一定要使用管道,不能将结果写入文件,然后稍后再进行操作吗? - Srinivas Reddy Thatiparthy
6
@SrinivasReddyThatiparthy:管道是Unix的精髓,你的评论无效。 - Stan
2个回答

28

使用 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']

你也可以使用这个 Shebang 将 Python 脚本制作成 shell 脚本:

#!/usr/bin/env python

并将权限更改为'a+x'

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

谢谢,它可以工作了,而且幸运的是我可以在那个盒子上导入sys(它是solaris 10,导入其他模块有问题,对于某些模块,它会抛出“ImportError:ld.so.1:/usr/local/bin/python:fatal:relocation error:file /usr/local/lib/python2.6/lib-dynload/_socket.so:symbol inet_aton:referenced symbol not found”,因为在solaris上是inet_pton。) - delta

3

从sys.stdin读取,它是一种类似文件的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接