如何在 bash 中使 python 脚本“可管道化”?

新手上路,请多包涵

我写了一个脚本,我希望它可以在 bash 中进行 _管道传输_。就像是:

 echo "1stArg" | myscript.py

可能吗?如何?

原文由 gbr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

看到这个简单的 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

原文由 khachik 发布,翻译遵循 CC BY-SA 2.5 许可协议

我将用一个使用 fileinput 来实现 UNIX 工具的典型行为的 grep 示例来补充其他答案: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

原文由 tokland 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题