python - 对 python 输入文件参数和标准输入流使用两个管道

标签 python linux bash hadoop

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

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

最佳答案

我想你要找的是:

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

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

关于python - 对 python 输入文件参数和标准输入流使用两个管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792428/

相关文章:

Python - 有没有办法绕过 'os.listdir()' 返回错误文件夹名称的乱码?

database - 基于选项卡的行拆分会错过空列 - Perl

regex - 使用 BASH 中的 shell 脚本在正则表达式上将一个大的 txt 文件拆分为 200 个较小的 txt 文件

bash - 无法在 Zsh 中找到 Bash 的完整替代命令

linux - 使用一个命令的输出作为下一个命令的输入

python - 使用Gstreamer的音频录制脚本质量很差

java - 如何使用数据存储区 java 客户端检索具有重复属性的嵌入式实体

python - 解释 “Traceback (most recent call last):”错误

linux - UNIX 脚本文件的开头是否允许使用 Unicode 字节顺序标记?

Linux:使用鼠标加*键盘*修饰符模拟滚动