2014-11-12 2 views
7

Я играю с библиотекой подпроцессов. Я могу выполнитьОбъект subprocess.check_output() имеет атрибут 'check_output'

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

какая версия питона на удаленная машина? –

+0

@PadraicCunningham 2.6.7 – Liondancer

ответ

16

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 часть документации может быть полезным

+0

Возможно, вам знакома альтернатива? Я просто хочу получить вывод в список – Liondancer

+1

Я добавлю что-нибудь через пару минут –

+0

Я читал о Попене, и это взаимоблокировки происходят? Это то, о чем я беспокоюсь. Как я мог предотвратить это? – Liondancer

0

Вот моя версия subprocess.check_output функции для Python 2.6 и поддерживает линии труб наряду с привычным интерфейсом командной строки.

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): 
     cmd_list = sub_cmd.strip().split(" ") 
     STDIN = None 
     if i > 0: 
      STDIN = process_list[i - 1].stdout 
     process_list.append(subprocess.Popen(cmd_list, stdin=STDIN, stdout=subprocess.PIPE)) 
    if len(process_list) == 0: 
     return '' 
    output = process_list[i].communicate()[0] 
    return output 

Контрольный звонок:

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

Выход:

drwxr-хт-х 1 корень корень +4096 11 декабря 13:22 журнала

Смежные вопросы