2014-11-12 8 views
7

Ich spiele mit der Subprozessbibliothek. Ich kannsubprocess.check_output() Modulobjekt hat das Attribut 'check_output'

v = subprocess.check_output("ls")

durchführen und es funktioniert gut. Allerdings, wenn ich SSH in eine Maschine und ich möchte ein hadoop Befehl auszuführen,

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

I

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

bekommen nicht ganz sicher, warum. Ich denke, es könnte mein mangelndes Verständnis des Subprozesses sein. Wie kann ich diesen Fehler beheben?

+0

, welche Version von Python auf die entfernte Maschine? –

+0

@PadraicCunningham 2.6.7 – Liondancer

Antwort

16

check_output wurde in python 2.7 eingeführt, so funktioniert nicht für < 2.7.

Sie können Popen mit communicate verwenden, um die Ausgabe zu erhalten.

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

This Teil der Dokumentation kann

+0

Würdest du zufällig eine Alternative kennen? Ich möchte einfach die Ausgabe in eine Liste – Liondancer

+1

bekommen Ich werde etwas in ein paar Minuten hinzufügen –

+0

Ich las über Popen und dass Deadlocks auftreten? Das macht mir Sorgen. Wie kann ich verhindern, dass dies geschieht? – Liondancer

0

Hier ist meine Version von subprocess.check_output Funktion für Python 2.6 und unterstützt Rohrleitungen zusammen mit gewöhnlicher Befehlsschnittstelle nützlich sein.

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 

Testanruf:

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

Ausgang:

drwxr-xr-x 1 root root 4096 11. Dezember 13.22 log

Verwandte Themen