2009-09-08 15 views
7

W języku Python, jaki jest najprostszy sposób wykonania lokalnego polecenia systemu Linux przechowywanego w ciągu znaków podczas przechwytywania wszelkich potencjalnych wyjątków, które są zgłaszane i protokołowania danych wyjściowych polecenia systemu Linux oraz wszelkich przechwyconych błędów w typowym pliku dziennika?W języku Python, jaki jest najlepszy sposób wykonywania lokalnego polecenia systemu Linux przechowywanego w ciągu znaków?

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

@ Chris, zaktualizowałem swoją odpowiedź. –

Odpowiedz

16

Korzystanie z modułu subprocess jest poprawny sposób to zrobić:

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 podproces oczekuje polecenia w postaci listy tak aby uruchomić "ls -l", musisz to zrobić:

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

T o uogólnij to trochę.

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

Alternatywnie można to zrobić, wyjście przejdzie bezpośrednio do pliku dziennika więc zmienna wyjściowa będzie pusta w tym przypadku:

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

@ chrispy, naprawione. Dzięki! –

+0

Każdy pomysł, dlaczego to podejście wydaje się działać dla ciągów cmd takich jak "ls" i "dir", ale generuje OSError dla łańcuchów takich jak "python -h" i "apt-get -h"? – Chris

+0

@ Chris, na pewno. Dodam szczegóły do ​​odpowiedzi: –

0

podproces to najlepszy moduł do tego.

Masz różne sposoby uruchamiania skryptów, w osobnych wątkach lub w tym samym oczekiwaniu na zakończenie każdego polecenia. Sprawdź cały dokumenty, które są bardziej niż przydatne:

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

-3

Wyjazd moduł 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() 

Określanie Exception jako klasy wyjątków po except powie Python złapać wszystkie możliwe wyjątki.

+0

Byłoby znacznie więcej pożytku, gdybyś podał powód, dla którego nie zgadzasz się z komentarzem przed rezygnacją. O co ci chodzi? – Alex

+3

'Polecenia' jest przestarzałe. – habnabit

+0

podproces to właściwa droga – aliceinwire

Powiązane problemy