Подтвердить что ты не робот

Как сохранить результат выполнения команды оболочки в переменной в python?

Мне нужно сохранить результат команды оболочки, которую я выполнил в переменной, но я не смог заставить ее работать. Я пытался как:

import os    

call = os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")
print call

Но он печатает результат в терминале и печатает значение вызова как ноль, возможно, указывающее как успех. Как получить результат, хранящийся в переменной?

4b9b3361

Ответ 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

Все остальные ответы здесь являются точными ответами. Во многих ситуациях вам нужно запускать внешние команды.

В этом конкретном примере есть еще один вариант: вы можете прочитать файл, обработать его по строкам и сделать что-то с выходом.

Хотя этот ответ не работает для "более общего вопроса, задаваемого", я думаю, что его всегда следует учитывать. Это не всегда "правильный ответ", даже там, где это возможно. Помня об этом (проще), и зная, когда (не) применить его (сложнее), сделает вас лучшим программистом.