2016-11-28 51 views
0

我有一个Python脚本,它需要一个--file xyz.json参数。作为文件嘲笑stdin

事情是,我的JSON是巨大的,因此它是Gzipped。当然,我可以解压缩然后运行脚本,但这看起来很浪费。有没有一种巧妙的方式可以让我在做zcat xyz.json.gz | myscript.py --file ?????的同时工作。我不想修改myscript.py来读取stdin而不是文件,除非无法以其他方式完成此操作。

谢谢!

+0

约庆典** [进程替换]什么(https://www.gnu.org/software/bash/manual/html_node/Process- Substitution.html)**? 'myscript.py --file <(zcat file.gz)'?请注意,这可能同样浪费 - 尽管它可能更方便。 – ghoti

回答

4

尝试:

myscript.py --file <(zcat xyz.json.gz) 

返回含有管的文件描述符。假设脚本只是读取文件,而不向前和向后搜索,这应该工作。

<(...)被称为process substitution

至于发生什么的详细阐述:

% awk 'BEGIN{print "filename:", ARGV[1]};1' <(echo first; sleep 1; echo second) 
filename: /proc/self/fd/11 
first 
second 

second被延迟一段时间后打印。所以:awk获取文件名称/proc/self/fd/11,并开始处理它。它会立即看到第一行,并将其打印出来。然后,在睡觉之后,它会看到第二行,并打印出来。

+0

在执行main命令之前,这会提取'xyz.json.gz'还是会将文件内容'stream'解压缩? – user1265125

+0

这将产生一个流。它就像蟒蛇的“屈服”,或者更精确一些,就像一根管子。 – joepd

+0

我很好奇这将如何在Python结束。代码期望--file参数是一个字符串文件路径,并且它试图用'open()'打开文件路径。那么这个流程替换是否会传递一个代表临时文件的字符串呢? – user1265125

2

可以使用/dev/stdin或(等效)/dev/fd/0

zcat xyz.json.gz | myscript.py --file /dev/stdin 
zcat xyz.json.gz | myscript.py --file /dev/fd/0 
+0

假定您的文件系统中存在'/ dev/stdin'。 'bash'只有在它是重定向的目标时才会专门处理它。 – chepner

+0

@chepner:有趣的,好的。 '/ dev/stdin'会丢失什么样的系统? – ruakh

+0

最相关的是“Python在没有本地支持/ dev/stdin的系统上专门处理名称/ dev/stdin?” - 我不知道答案。我知道我在我的一个节目中增加了这种支持 - 大约在20年前,哦,就像现在这样普遍。我不知道大多数人是否做到了这一点。 –