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

e4yzc0pl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(476)

我想用 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_/clickstream/{d_20151221-2300}/* 好像不是管子 | 用来计算所有文件中的行数

9udxz4iz

9udxz4iz1#

在您的示例中,传递管道 | 字符作为 subprocess.Popen 与bash中创建进程管道的方式不同。相反,管道 | 字符正在向单个进程传递参数。
相反,您需要将两个单独的 subprocess.Popen 调用以模拟bash样式的管道。关于 subprocess 模块包含更多详细信息。
https://docs.python.org/2/library/subprocess.html#replacing-壳牌管道

相关问题