Как сохранить результат выполнения команды оболочки в переменной в python?
Мне нужно сохранить результат команды оболочки, которую я выполнил в переменной, но я не смог заставить ее работать. Я пытался как:
import os
call = os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")
print call
Но он печатает результат в терминале и печатает значение вызова как ноль, возможно, указывающее как успех. Как получить результат, хранящийся в переменной?
Ответы
Ответ 1
Используйте subprocess
:
import subprocess
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", shell=True)
Изменить: это новое в Python 2.7. В более ранних версиях это должно работать (с командой, переписанной, как показано ниже):
import subprocess
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0]
В качестве дополнительной заметки вы можете переписать
cat syscall_list.txt | grep f89e7000
Для
grep f89e7000 syscall_list.txt
И вы можете даже заменить весь оператор одним awk
script:
awk '/f89e7000/ {print $2}' syscall_list.txt
Переходя к:
import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])
Ответ 2
command.getstatusoutput будет хорошо работать в этой ситуации. (Устарело с версии Python 2.6)
import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))
Ответ 3
В Python 3 вы можете использовать
import subprocess as sp
output = sp.getoutput('whoami --version')
print (output)
''
Ответ 4
os.popen работает для этого. popen - открывает канал для или из команды. Возвращаемое значение - открытый объект файла, связанный с каналом, который может быть прочитан. split ('\n') преобразует вывод в список
import os
list_of_ls = os.popen("ls").read().split('\n')
print list_of_ls
import os
list_of_call = os.popen("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'").read().split('\n')
print list_of_call
Ответ 5
Все остальные ответы здесь являются точными ответами. Во многих ситуациях вам нужно запускать внешние команды.
В этом конкретном примере есть еще один вариант: вы можете прочитать файл, обработать его по строкам и сделать что-то с выходом.
Хотя этот ответ не работает для "более общего вопроса, задаваемого", я думаю, что его всегда следует учитывать. Это не всегда "правильный ответ", даже там, где это возможно. Помня об этом (проще), и зная, когда (не) применить его (сложнее), сделает вас лучшим программистом.