Python 运行命令的子进程popen(HDFS/hadoop)

Python 运行命令的子进程popen(HDFS/hadoop),python,hadoop,subprocess,popen,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

我正在尝试使用
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}/*


在您的示例中,似乎没有使用管道
来计算所有文件中的行数,而是将管道
字符作为参数传递给
子进程。Popen
创建进程管道的方式与Bash中的方式不同。相反,管道
|
字符被传递给单个进程一个参数

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

相关: