2009-09-08 6 views
7

In Python, qual è il modo più semplice per eseguire un comando Linux locale memorizzato in una stringa mentre si rilevano eventuali eccezioni che vengono lanciate e si registra l'output del comando Linux e gli eventuali errori rilevati in un file di registro comune?In Python, qual è il modo migliore per eseguire un comando Linux locale memorizzato in una stringa?

String logfile = “/dev/log” 
String cmd = “ls” 
#try 
    #execute cmd sending output to >> logfile 
#catch sending caught error to >> logfile 
+0

@Chris, ho aggiornato la mia risposta. –

risposta

16

Utilizzando il modulo subprocess è il modo corretto per farlo:

import subprocess 
logfile = open("/dev/log", "w") 
output, error = subprocess.Popen(
        ["ls"], stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE).communicate() 
logfile.write(output) 
logfile.close() 

EDIT sottoprocesso si aspetta che i comandi come un elenco in modo per eseguire "ls -l" devi eseguire questa operazione:

output, error = subprocess.Popen(
        ["ls", "-l"], stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE).communicate() 

T o generalizzalo un po '.

command = "ls -la" 
output, error = subprocess.Popen(
        command.split(' '), stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE).communicate() 

In alternativa si può fare questo, l'uscita andrà direttamente al file di log in modo che la variabile di uscita sarà vuota, in questo caso:

import subprocess 
logfile = open("/dev/log", "w") 
output, error = subprocess.Popen(
        ["ls"], stdout=logfile, 
        stderr=subprocess.PIPE).communicate() 
+0

@chrispy, corretto. Grazie! –

+0

Qualche idea sul perché questo approccio sembra funzionare per le stringhe cmd come "ls" e "dir", ma genera un OSError per stringhe come "python -h" e "apt-get -h"? – Chris

+0

@Chris, certo. Aggiungerò i dettagli alla risposta –

0

il sottoprocesso è il miglior modulo per questo.

Esistono diversi modi per eseguire gli script, in thread separati o nella stessa attesa di completamento di ciascun comando. Controllare l'intera documentazione che sono più che utile:

http://docs.python.org/library/subprocess.html

-3

Partenza modulo commands.

import commands 
    f = open('logfile.log', 'w') 
    try: 
     exe = 'ls' 
     content = commands.getoutput(exe) 
     f.write(content) 
    except Exception, text: 
     f.write(text) 
    f.close() 

Specificando Exception come classe di eccezione dopo except dirà Python per catturare tutte le eccezioni possibili.

+0

Sarebbe molto più utile se tu dessi un motivo per cui non sei d'accordo con il commento prima del downvoting. Qual è il tuo punto? – Alex

+3

'commands' è stato deprecato per un po '. Il sottoprocesso – habnabit

+0

è la giusta via da percorrere – aliceinwire

Problemi correlati