2013-04-10 3 views
2

Я пытаюсь перевести команду bash на подпроцесс в python. Команда bash:Попытка перевести инструкцию bash на подпроцесс в python

cat LogFile.msg.log | grep ABCD | awk '{print $ 14, $ 10, $ 5, $ 7}' | sort -t '' -k4 -n -r | голова -10> output.csv

До сих пор я следующий за подпроцесса:

cat = subprocess.Popen(['cat', 'LogFile.msg.log'], 
         stdout=subprocess.PIPE, 
         ) 
grep = subprocess.Popen(['grep', 'ABCD'], 
         stdin=cat.stdout, 
         stdout=subprocess.PIPE, 
         ) 
awk = subprocess.Popen(['awk', '{print $14,$10,$5,$7}'], 
         stdin=grep.stdout, 
         stdout=subprocess.PIPE, 
         ) 
sort = subprocess.Popen(['sort', '-t','' '', '-k4', '-n', '-r'], 
         stdin=awk.stdout, 
         stdout=subprocess.PIPE, 
         ) 
head = subprocess.Popen(['head', '-10'], 
         stdin=sort.stdout, 
         stdout=subprocess.PIPE, 
         ) 
out = subprocess.Popen(['>', 'output.csv'], 
         stdin=head.stdout, 
         stdout=subprocess.PIPE, 
         ) 
end_of_pipe = out.stdout 

Сейчас я получаю следующее сообщение об ошибке:

Sort: empty tab 
Traceback (most recent call last): 
    File "./latency2", line 39, in <module> 
    stdout=subprocess.PIPE, 
    File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__ 
    errread, errwrite) 
    File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

Я уверен, «что-то не хватает, но не знаю, что.

+0

Вы уверены, что ваш рабочий каталог является правильным ? – eazar001

ответ

3

У вас есть две проблемы. Во-первых, вы неправильно переводите аргументы в sort. При выполнении этой команды sort:

sort -t' ' -k4 -n -r 

The оболочка паста вместе маркеры -t и ' ' в один аргумент "-t " (тир, тройник, пространства). Итак, правильные аргументы подпроцесса для него должно быть:

sort = subprocess.Popen(['sort', '-t ', '-k4', '-n', '-r'], 
         stdin=awk.stdout, 
         stdout=subprocess.PIPE, 
         ) 

Вторая проблема заключается окончательный Перенаправление в файл с > output.csv лексем. Когда оболочка видит это, она не запускает команду с именем >; скорее, он открывает файл output.csv для записи и устанавливает его в стандартный дескриптор вывода последней команды. Таким образом, вы не должны пытаться запустить команду с именем > в качестве подпроцесса; вместо этого вы должны подражать скорлупу, открыв файл:

head = subprocess.Popen(['head', '-10'], 
         stdin=sort.stdout, 
         stdout=open('output.csv', 'w'), # Not a pipe here 
         ) 
+0

это работа совершенно. Я знал, что мой вывод на .csv был взломан. Благодаря! – user2234571

+0

У меня есть еще один вопрос. В моей первой строке я пытаюсь найти файл, содержащий текущую дату. Операция bash работает с использованием LogFile_'date +% Y% m% d'.msg.log (LogFile_20120410.msg.log). Но это не работает в подпроцессе. Я получаю «Нет такого файла или каталога». Любые идеи, почему это не будет правильно переводить в подпроцесс? – user2234571

1

Вы могли бы переписать:

cat LogFile.msg.log | grep ABCD | awk '{print $14,$10,$5,$7}' | 
sort -t' ' -k4 -n -r | head -10 > output.csv 

в чистом Python:

from heapq import nlargest 
from operator import itemgetter 

select_items = itemgetter(13, 9, 4, 6) # note: zero-based indices 
with open('LogFile.msg.log') as file, open('output.csv', 'w') as outfile: 
    rows = (select_items(line.split()) for line in file if 'ABCD' in line) 
    top10_rows = nlargest(10, rows, key=lambda row: int(row[3])) 
    print("\n".join(map(" ".join, top10_rows))) 
Смежные вопросы