2014-11-12 14 views
7

Sto giocando con la libreria di sottoprocesso. Posso eseguiresubprocess.check_output() oggetto modulo ha l'attributo out 'check_output'

v = subprocess.check_output("ls")

e funziona benissimo. Tuttavia, quando ho SSH in una macchina e voglio eseguire un comando Hadoop,

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

ottengo

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

Non del tutto sicuro perché. Penso che potrebbe essere la mia mancanza di comprensione del sottoprocesso. Come posso risolvere questo errore?

+0

quale versione di Python su la macchina remota? –

+0

@PadraicCunningham 2.6.7 – Liondancer

risposta

16

check_output è stato introdotto in python 2.7 pertanto non funzionerà per < 2.7.

È possibile utilizzare Popen con communicate per ottenere l'output.

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

This parte dei documenti può essere utile

+0

Ti piacerebbe sapere un'alternativa? Voglio semplicemente ottenere l'output in una lista – Liondancer

+1

Aggiungerò qualcosa in un paio di minuti –

+0

Ho letto in giro su Popen e che si verificano stallo? Questo è qualcosa di cui sono preoccupato. Come posso evitare che ciò si verifichi? – Liondancer

0

Ecco la mia versione di subprocess.check_output funzione per Python 2.6 e supporta tubazioni con interfaccia di comando abituale.

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 

chiamata di prova:

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

uscita:

radice drwxr-xr-x 1 root 4096 11 Dicembre 13:22 registro

Problemi correlati