subprocess popen运行命令(HDFS / hadoop)

时间:2015-12-22 00:14:51

标签: python hadoop subprocess popen

我正在尝试使用subprocess.popen在我的计算机上运行命令。

这是我到目前为止所拥有的

cmdvec = ['/usr/bin/hdfs', 'dfs', '-text', '/data/ds_abc/clickstream/{d_20151221-2300}/*', '|', 'wc', '-l']

subproc = subprocess.Popen(cmdvec, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.STDOUT)

如果我在终端中运行命令,我会得到

的输出
15/12/21 16:09:31 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
15/12/21 16:09:31 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 9cd4009fb896ac12418449e4678e16eaaa3d5e0a]
15/12/21 16:09:31 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
15305

数字15305是我想要的值。

当我通过拆分并将其转换为列表来运行命令时,我这样做是为了尝试获取这些行:

for i in subproc.stdout:
    print(i)

然而,这给了我数据,好像运行了这个命令,因为正在显示文件中的所有数据。

/usr/bin/hdfs dfs -text /data/ds_abc/clickstream/{d_20151221-2300}/*

管道|似乎不是用来计算所有文件中的行数

1 个答案:

答案 0 :(得分:3)

在您的示例中,将管道|字符作为参数传递给subprocess.Popen并不会像Bash那样创建流程管道。相反,管道|字符正在将参数传递给单个进程。

相反,您需要将两个独立的subprocess.Popen调用链接在一起以模拟Bash样式的管道。 subprocess模块上的此文档包含更多详细信息。

https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline