如何使Python脚本在bash中可管道化?

64 投票
4 回答
42417 浏览
提问于 2025-04-16 08:28

我写了一个脚本,我希望它可以在bash中使用管道。就像这样:

echo "1stArg" | myscript.py

这可能吗?怎么做?

4 个回答

11

在你的Python脚本中,你只需要从 stdin 读取数据。

21

我来补充一下其他回答,给大家一个使用 grep 的例子,这个例子用到了 fileinput,它实现了 UNIX 工具的典型行为:1)如果没有指定参数,它会从标准输入(stdin)读取数据;2)可以指定多个文件作为参数;3)单个参数 - 表示标准输入。

import fileinput
import re
import sys

def grep(lines, regexp):
    return (line for line in lines if regexp.search(line))

def main(args):
    if len(args) < 1:
        print("Usage: grep.py PATTERN [FILE...]", file=sys.stderr)
        return 2 

    regexp = re.compile(args[0])
    input_lines = fileinput.input(args[1:])

    for output_line in grep(input_lines, regexp):
        sys.stdout.write(output_line)

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

示例:

$ seq 1 20 | python grep.py "4"
4
14
80

看看这个简单的 echo.py 文件:

import sys

if __name__ == "__main__":
    for line in sys.stdin:
        sys.stderr.write("DEBUG: got line: " + line)
        sys.stdout.write(line)

运行这个程序:

ls | python echo.py 2>debug_output.txt | sort

输出结果是:

echo.py
test.py
test.sh

debug_output.txt 文件的内容是:

DEBUG: got line: echo.py
DEBUG: got line: test.py
DEBUG: got line: test.sh

撰写回答