【问题标题】:How redirect a shell command output to a Python script input ?如何将 shell 命令输出重定向到 Python 脚本输入?
【发布时间】:2023-03-30 10:54:01
【问题描述】:

这可能是一些非常基本的东西,但我找不到一个好的解决方案。 我需要编写一个可以接受来自管道的输入的 python 脚本,如下所示:

$ some-linux-command | my_script.py

类似这样的:

cat email.txt | script.py

或者它只会由我的 .forward 文件直接从 sendmail 传送。这意味着输入文件可能会比较大,如果它有附件,它可能是一封电子邮件,稍后我将不得不将发件人,主题等放入数据库,但我已经编写了数据库脚本在python中,所以那部分就可以了。 主要问题是如何捕获从管道流入的数据。

【问题讨论】:

  • 你为什么一直盯着管道,你不能把结果写到文件里,然后再对它做操作吗?
  • @SrinivasReddyThatiparthy :管道是Unix的本质,你的评论无效。

标签: python shell input pipe


【解决方案1】:

从 sys.stdin 读取,这是一个类似对象的文件

【讨论】:

    【解决方案2】:

    使用 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:致命:重定位错误:文件/usr/local/lib/python2.6/lib-dynload/_socket.so:符号inet_aton:找不到引用的符号”,因为它是solaris上的inet_pton。 )