ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Выполнение команд оболочки с Python

Python — отличный язык сценариев. Все больше системных администраторов используют скрипты Python для автоматизации своей работы.

Поскольку в задачи системный администратор все время включает команды Linux, выполнение команд Linux из скрипта Python является отличной помощью.

В этой статье мы покажем вам пару способов, которыми вы можете запускать команды оболочки и получать их вывод в своей программе Python.

 

Выполнить команду Shell в Python с модулем os

Позвольте нам создать простую программу на Python, которая выполняет команду оболочки с модулем os.

import os 
myCmd = 'ls -la' 
os.system (myCmd)

 

Теперь, если мы запускаем эту программу, и вот что мы видим в выводе.

python myprog.py 
total 40
drwxr-xr-x  3 andreyex andreyex 4096 Jan 20 13:23 .
drwxr-xr-x 49 andreyex andreyex 4096 Jan 20 13:34 ..
-r--r--r--  1 andreyex andreyex  456 Dec 19 20:51 andreyex.txt
-rw-r--r--  1 andreyex andreyex    0 Jan 20 11:32 master
-rw-r--r--  1 andreyex andreyex   14 Jan 10 21:22 masterX.txt
-rw-r--r--  1 andreyex andreyex   14 Jan 10 12:17 destroyer.txt
--w-r--r--  1 andreyex andreyex  356 Jan 20 13:12 mytest.txt
-rw-r--r--  1 andreyex andreyex  356 Dec 24 15:18 login.txt
-rw-r--r--  1 andreyex andreyex   44 Jan 20 10:53 mymyprog.py
-rw-r--r--  1 andreyex andreyex  356 Dec 22 15:33 turbo.txt
drwxr-xr-x  3 andreyex andreyex 4096 Jan  3 20:51 target

 

Это содержимое каталога, в котором хранится myprog.py.

Если вы хотите использовать вывод команды оболочки, вы можете сохранить его в файле непосредственно из команды оболочки:

import os
myCmd = 'ls -la > out.txt'
os.system(myCmd)

 

Вы также можете сохранить выходные данные команды оболочки в переменной следующим образом:

import os
myCmd = os.popen('ls -la').read()
print(myCmd)

 

Если вы запустите вышеупомянутую программу, она напечатает содержимое переменной myCmd и будет такой же, как и результат команды ls, которую мы видели ранее.

Теперь давайте посмотрим другой способ запуска команды Linux в Python.

 

Выполнить команду оболочки в Python с модулем подпроцесса

Несколько лучший способ запуска команд оболочки в Python — использование подпроцессмодуль.

Если вы хотите запустить команду оболочки без каких-либо параметров и аргументов, вы можете вызвать подпроцесс следующим образом:

import subprocess
subprocess.call("ls")

 

Метод call выполнит команду оболочки. Вы увидите содержимое текущего рабочего каталога при запуске программы:

python myprog.py 
agatha.txt  count1.txt    file1.txt  myprog.py   target
count        count2.txt  file2.txt  sherlock.txt

 

Если вы хотите предоставить опции и аргументы вместе с командой оболочки, вам придется предоставить их в виде списка.

import subprocess
subprocess.call(["ls", "-l", "."])

 

Когда вы запустите программу, вы увидите содержимое текущего каталога в виде списка.

Теперь, когда вы знаете, как запустить команду оболочки с подпроцессом, возникает вопрос о сохранении вывода команды оболочки.

Для этого вам нужно будет использовать функцию Popen. Он выводит объект Popen, у которого есть метод communication(), который можно использовать для получения стандартного вывода и ошибки в виде кортежа.

import subprocess
MyOut = subprocess.Popen(['ls', '-l', '.'], 
            stdout=subprocess.PIPE, 
            stderr=subprocess.STDOUT)
stdout,stderr = MyOut.communicate()
print(stdout)
print(stderr)

 

Когда вы запустите программу, вы увидите stdout и stderr (которых в данном случае нет).

python myprog.py 
 total 32
 -r--r--r-- 1 andreyex andreyex  456 Dec 11 21:29 agatha.txt
 -rw-r--r-- 1 andreyex andreyex    0 Jan 20 12:11 count
 -rw-r--r-- 1 andreyex andreyex   14 Jan 10 16:12 count1.txt
 -rw-r--r-- 1 andreyex andreyex   14 Jan 10 16:12 count2.txt
 --w-r--r-- 1 andreyex andreyex  356 Jan 20 12:10 file1.txt
 -rw-r--r-- 1 andreyex andreyex  356 Dec 17 09:59 file2.txt
 -rw-r--r-- 1 andreyex andreyex  212 Jan 20 16:54 myprog.py
 -rw-r--r-- 1 andreyex andreyex  356 Dec 11 21:35 sherlock.txt
 drwxr-xr-x 3 andreyex andreyex 4096 Jan  4 20:10 target

None

 

Мы надеемся, что этот быстрый совет помог вам выполнить команду оболочки в программах Python. Если у вас есть вопросы или предложения, пожалуйста, не стесняйтесь оставить комментарий ниже.

Exit mobile version