对 Python 输入文件参数和 STDIN 流式处理使用两个管道



是否有一种单行方法可以在 linux bash 中运行以下 python 脚本,而无需保存任何临时文件(/dev/std* 除外)?我的 Python 脚本 test.py 将文件名作为参数,但也将 sys.stdin 作为流输入。

#test.py
#!/usr/bin/python
import sys
fn=sys.argv[1]
checkofflist=[]
with open(fn,'r') as f:
    for line in f.readlines():
        checkofflist.append(line)
for line in sys.stdin:
    if line in checkofflist:
        # do something to line

我想做类似的事情

hadoop fs -cat inputfile.txt > /dev/stdout | cat streamingfile.txt | python test.py /dev/stdin

但是,这当然不起作用,因为中间的猫会破坏预期的/dev/stdin 内容。能够做到这一点很好,因为那时我不需要每次需要使用它们时都在本地保存 hdfs 文件。

我认为

您要查找的是:

python test.py <( hadoop fs -cat inputfile.txt ) <streamingfile.txt 

在 bash 中,<( ... )是过程替换。括号内的命令在将其输出连接到 fifo 或等效项的情况下运行,并且 fifo 的名称(如果 bash 能够使用未命名的管道,则/dev/fd/n)被替换为参数。该工具会看到一个文件名,它可以正常打开和使用。(>(...)也可用,输入连接到FIFO,以防您想要命名的流输出。

不依赖bash进程替换,您也可以尝试

hadoop fs -cat inputfile.txt | python test.py streamingfile.txt

这提供了streamingfile.txt作为命令行参数,供test.py用作要打开的文件名,并提供标准输入上的inputfile.txt内容。

相关内容

  • 没有找到相关文章