如何制作python脚本;“管道式”;在bash?

如何制作python脚本;“管道式”;在bash?,python,pipe,Python,Pipe,我写了一个脚本,我希望它能在bash中通过管道传输。比如: echo "1stArg" | myscript.py 可能吗?怎么做?从stdin读取的所有内容都是“可管道的”。Pipe只是将前一个程序的stdout重定向到后一个程序。在Python脚本中,您可以简单地使用它。请参见下面这个简单的echo.py: import sys if __name__ == "__main__": for line in sys.stdin: sys.stderr.write("

我写了一个脚本,我希望它能在bash中通过管道传输。比如:

echo "1stArg" | myscript.py

可能吗?怎么做?

从stdin读取的所有内容都是“可管道的”。Pipe只是将前一个程序的stdout重定向到后一个程序。

在Python脚本中,您可以简单地使用它。

请参见下面这个简单的
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

我将用一个用于实现UNIX工具典型行为的grep示例来补充其他答案:1)如果没有指定参数,它将从stdin读取数据;2) 许多文件可以指定为参数;3)
-
的单个参数表示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:]))

循环的编写方式(
而True
…)既不正确,也肯定不是pythonic。事实上,一个空的输入行将中断循环。一个简单而标准的解决方案是使用sys.stdin中的行读取标准输入。另外,开头的
行=''
完全是多余的。太好了!我冒昧地用标准的4个空格(参见PEP 8)而不是原来使用的2个空格缩进了代码。
$ seq 1 20 | python grep.py "4"
4
14