0

我正在尝试在我的 python 脚本中获取以下 shell 命令的输出,

hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}

os.popen我可以通过如下方式成功获得输出:

import os
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = os.popen(cmd,"r")
while 1:
    line = p.readline()
    if not line: break
    print line

但是os.popen()自 python 2.6 以来已被弃用,所以我想用subprocess.Popen()函数替换上面的代码片段。

但是subprocess.Popen()下面的代码片段给出的结果与上面的代码片段不同。

import subprocess as sub
import shlex
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
args = shlex.split(cmd)
p = sub.Popen(args,stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

上面的命令只是给出了'hadoop fs -ls /projectpath/'部分命令的输出。我已经尝试咨询几个参考资料(http://docs.python.org/2/library/subprocess.html#popen-objects,Python,os.system用于命令行调用(linux)不返回它应该返回的内容?subpocess.Popen()但无法让它执行字符串 cmd 中的命令。谁能指出我做错了什么?

4

1 回答 1

2

试试这个:

cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = sub.Popen(cmd,stdout=sub.PIPE,stderr=sub.PIPE, shell=True)
于 2013-07-29T06:00:27.670 回答