是否有一种单行方法可以在 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
内容。