我正在玩子进程库。我可以执行
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'
不太清楚为什么。我想可能是我对子流程缺乏了解。我该如何解决这个错误?
答案 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()