【问题标题】:subprocess.check_output() module object has out attribute 'check_output'subprocess.check_output() 模块对象具有属性“check_output”
【发布时间】:2014-11-12 18:33:28
【问题描述】:

我正在玩子进程库。我可以表演

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'

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

【问题讨论】:

  • 远程机器上的python是什么版本?
  • @PadraicCunningham 2.6.7

标签: python hadoop


【解决方案1】:

check_output 是在 python 2.7 中引入的,因此不适用于 &lt; 2.7

您可以使用Popencommunicate 来获取输出。

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

This 部分文档可能有用

【讨论】:

  • 你会碰巧知道替代方案吗?我只是想把输出放到一个列表中
  • 我会在几分钟内添加一些东西
  • 我阅读了有关 Popen 的信息,并且会发生死锁?这是我担心的事情。我怎样才能防止这种情况发生?
  • 你的意思是使用多个进程吗?
  • @Liondancer 如果您查看check_output 的来源,您会发现它完全符合答案中的描述。它还有许多其他代码来设置参数和处理异常,但它所做的只是创建一个Popen 并调用communicate。您所指的注释仅在子流程产生 大量 数据时有效。在这种情况下,您必须“懒惰地”从进程 stdout 中读取以避免缓冲。
【解决方案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

【讨论】:

  • 添加了“shell=True”并删除了不必要的行。这将修复正在运行的“curl”命令。
【解决方案3】:

padraic-cunningham,虽然您的回答让我成功了,但在我的情况下,该命令是 SSH 命令。由于通信过早地杀死了我的进程(一旦它读取 EOF 字符),我发现以下方法效果更好:

import subprocess

def check_output(command_list):
    proc = subprocess.Popen(command_list, stdout=subprocess.PIPE)
    proc.wait()
    return proc.stdout.read()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 2013-02-13
    • 2010-11-18
    • 2019-01-03
    • 2017-05-19
    • 2013-02-01
    • 2018-02-27
    相关资源
    最近更新 更多