如何在bash中创build一个python脚本“pipeable”?

我写了一个脚本,我希望它在bash中是可移植的。 就像是:

echo "1stArg" | myscript.py 

可能吗? 怎么样?

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

其他答案已经指向了sys.stdin ,我将用一个grep的例子来补充它们,它使用fileinput来实现UNIX工具的典型行为(如果没有指定文件,它从stdin读取;许多文件可以作为参数发送; -表示stdin):

 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 

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

从标准input读取的所有东西都是“可移动的”。 pipe道只是将原程序的标准redirect到后者。