子进程打开 运行 命令 (HDFS/hadoop)
subprocess popen to run commands (HDFS/hadoop)
我正在尝试在我的机器上使用 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}/*
似乎没有使用管道 |
来计算所有文件中的行数
在您的示例中,将管道 |
字符作为参数传递给 subprocess.Popen
不会像在 Bash 中那样创建进程管道。相反,管道 |
字符被传递给单个进程的参数。
相反,您需要将 2 个单独的 subprocess.Popen
调用链接在一起以模拟 Bash 风格的管道。 subprocess
模块上的此文档包含更多详细信息。
https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
我正在尝试在我的机器上使用 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}/*
似乎没有使用管道 |
来计算所有文件中的行数
在您的示例中,将管道 |
字符作为参数传递给 subprocess.Popen
不会像在 Bash 中那样创建进程管道。相反,管道 |
字符被传递给单个进程的参数。
相反,您需要将 2 个单独的 subprocess.Popen
调用链接在一起以模拟 Bash 风格的管道。 subprocess
模块上的此文档包含更多详细信息。
https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline