【问题标题】:use two pipelines for python input file argument and stdin streaming对 python 输入文件参数和标准输入流使用两个管道
【发布时间】:2014-02-15 22:25:54
【问题描述】:

是否有一种单线方法可以在 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 linux bash hadoop


    【解决方案1】:

    我认为您正在寻找的是:

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

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

    【讨论】:

    • 这可行,但感觉倒退:它强制通过标准输入读取实际文件,并且来自 hadoop 的输出流被强制进入文件而不是使用管道。
    • @chepner:我同意,但这就是 OP 中 python 脚本的本质。但是,流程替换非常灵活。您可以将这两个参数作为命名文件提供,并为您想要流式传输的任何一个使用进程替换。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 2013-11-04
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2012-02-23
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多