subprocess.check_output()模块对象具有属性'check_output'

时间:2014-11-12 18:33:29

标签: python hadoop

我正在玩子进程库。我可以执行

v = subprocess.check_output("ls")

它工作正常。但是,当我通过SSH连接到机器并且我想执行hadoop命令时,

v = subprocess.check_output("hadoop fs -ls /path/to/file* | grep -oE '/(.*)'")

我得到了

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'check_output'

不太清楚为什么。我想可能是我对子流程缺乏了解。我该如何解决这个错误?

3 个答案:

答案 0 :(得分:17)

check_output中引入了

python 2.7,因此不适用于< 2.7

您可以Popen使用communicate来获取输出。

from subprocess import PIPE,Popen
proc = Popen(['ls', '-l'], stdout=PIPE)
print(proc.communicate()[0].split())

This部分文档可能有用

答案 1 :(得分:2)

这是我的Python 2.6的 subprocess.check_output 函数版本,它支持管道线以及习惯命令界面。

import subprocess

def check_output(cmd):
    """ https://docs.python.org/2/library/subprocess.html#subprocess.Popen
        Implementation subprocess.check_output() for Python 2.6
     """
    process_list = []
    cmd_list = cmd.strip().split("|")
    for i, sub_cmd in enumerate(cmd_list):
        STDIN = None
        if i > 0:
            STDIN = process_list[i - 1].stdout
        process_list.append(subprocess.Popen(sub_cmd, stdin=STDIN, stdout=subprocess.PIPE, shell=True))
    if len(process_list) == 0:
        return ''
    output = process_list[i].communicate()[0]
    return output

测试电话:

print check_output('ls -la /var | grep log')

输出:

  

drwxr-xr-x 1 root root 4096 Dec 11 13:22 log

答案 2 :(得分:1)

padraic-cunningham,虽然你的答案让我在那里的一部分,在我的情况下,命令是一个SSH命令。由于沟通过早地杀死我的过程(一旦它读取EOF字符),我发现以下更好的工作:

.size()