【问题标题】:python subprocess.Popen vs os.popenpython subprocess.Popen vs os.popen
【发布时间】:2013-07-28 19:41:15
【问题描述】:

我正在尝试在我的 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() 函数替换上面的 sn-p。

但下面subprocess.Popen() 的代码 sn-p 给出的结果与上面的代码 sn-p 不同。

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/' 部分命令的输出。 我已经尝试为subpocess.Popen() 咨询几个参考资料(http://docs.python.org/2/library/subprocess.html#popen-objectsPython, os.system for command-line call (linux) not returning what it should?),但无法让它在字符串 cmd 中执行命令。谁能指出我做错了什么?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    试试这个:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多