Как сохранить результат выполненной команды оболочки в переменной в python? - PullRequest
21 голосов
/ 28 декабря 2011

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

import os    

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

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

Ответы [ 5 ]

38 голосов
/ 28 декабря 2011

Вместо этого используйте модуль 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 сценарием:

awk '/f89e7000/ {print $2}' syscall_list.txt

Ведущий к:

import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])
10 голосов
/ 28 декабря 2011

command.getstatusoutput будет хорошо работать в этой ситуации.(Устарело с Python 2.6)

import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))
1 голос
/ 09 апреля 2019

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
0 голосов
/ 21 марта 2019

В Python 3 вы можете использовать

import subprocess as sp
output = sp.getoutput('whoami --version')
print (output)

``
0 голосов
/ 13 октября 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...