Как да стартирате bash скриптове с Python?

Ако използвате Linux, тогава определено ще харесате командите на обвивката.

И ако работите с Python, тогава може да сте се опитали да автоматизирате нещата. Това е начин да спестите време. Може също да имате някои bash скриптове за автоматизиране на нещата.

Python е удобен за писане на скриптове от bash. И управлението на Python скриптове е лесно в сравнение със скриптовете bash. Ще ви е трудно да поддържате bash скриптовете, след като се разраства.

Но какво ще стане, ако вече имате bash скриптове, които искате да стартирате с Python?

Има ли някакъв начин за изпълнение на bash командите и скриптовете в Python?

Да, Python има вграден модул, наречен subprocess, който се използва за изпълнение на командите и скриптовете в скриптовете на Python. Нека да видим как да изпълняваме bash команди и скриптове в Python скриптове в детайли.

Изпълнение на Bash команди

Както може би вече сте видели, подпроцесът на модула се използва за изпълнение на bash командите и скриптовете. Той предоставя различни методи и класове за едно и също.

Има основно един метод и един клас, за които трябва да знаете от модула на подпроцеса. Те са управлявани и Попен. Тези две ни помагат да изпълним bash командите в Python скриптове. Нека ги видим един по един.

subprocess.run()

Методът subprocess.run() ще вземе списък от низове като позиционен аргумент. Това е задължително, тъй като има командата bash и аргументи за нея. Първият елемент в списъка е името на командата, а останалите елементи са аргументите на командата.

  10 приложения за медитация, предназначени за деца [2022]

Нека да видим бърз пример.

import subprocess
subprocess.run(["ls"])

Горният скрипт изброява всички елементи в текущата работна директория, както се крие в скрипта. Няма аргументи към командата в горния скрипт. Дадохме само командата bash. Можем да предоставим допълнителни аргументи на командата ls като -l, -a, -la и т.н.

Нека видим бърз пример с аргументи на командата.

import subprocess
subprocess.run(["ls", "-la"])

Горната команда показва всички файлове, включително скритите файлове, заедно с разрешенията. Предоставихме аргумента la, който показва файлове и директории с допълнителна информация и скрити файлове.

В крайна сметка може да направим някои грешки, докато пишем командите. Грешките ще нарастват според грешките. Ами ако искате да ги заснемете и да ги използвате по-късно? Да, можем да направим това с помощта на ключовия аргумент stderr.

Да видим един пример.

import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)

Уверете се, че нямате файла с името sample.txt в работната директория. Стойността на ключовия аргумент stderr е PIPE, което помага да се върне грешката в обект. Можем да получим достъп до него по-късно със същото име. И текстът на аргумента на ключовата дума помага да се каже, че изходът трябва да бъде низ.

По същия начин можем да уловим изхода на командата, като използваме аргумента на ключовата дума stdout.

import subprocess
result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)

subprocess.run() – вход

Можете да дадете вход на командите, като използвате аргумента на ключовата дума input. Ще предоставим входове във формат на низ. И така, трябва да зададем текста на аргумента на ключовата дума на True. По подразбиране го приема в байтове.

Нека разгледаме един пример.

import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")

В горната програма скриптът на Python add.py ще приеме две числа като вход. Дадохме входа на скрипта на Python, използвайки аргумента на ключовата дума input.

  Какво е процесор и какво прави?

подпроцес.Попен()

Класът subprocess.Popen() е по-напреднал от метода subprocess.run(). Това ни дава повече възможности за изпълнение на командите. Ще създадем екземпляр на subprocess.Popen() и ще го използваме за различни неща като познаване на състоянието на изпълнение на командата, получаване на изход, даване на вход и т.н.,

Има няколко метода на класа subprocess.Popen(), които трябва да знаем. Нека ги видим един по един заедно с примерите за код.

изчакайте

Използва се за изчакване до завършване на изпълнението на командата. Следващите редове на скрипта на Python няма да се изпълнят до завършване на предишната команда, която е написана след метода за изчакване. Да видим примера.

import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")

Изпълнете горния код и наблюдавайте резултата. Ще видите, че съобщението Завършено! се отпечатва преди изпълнението на командата. Можем да го избегнем с помощта на метода на изчакване. Нека изчакаме до завършване на командата.

import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()

print("Completed!")

Ако видите изхода за горния код, тогава ще разберете, че изчакването всъщност работи. Операторът за печат се изпълнява след завършване на изпълнението на командата.

общуват

Методът комуникиране се използва за получаване на изхода, грешка и въвеждане на командата. Той връща кортеж, съдържащ съответно резултат и грешка. Да видим един пример.

import subprocess
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)

subprocess.Popen() – вход

Не можем да предадем директно входа към класа Popen. Трябва да използваме аргумента на ключовата дума, наречен stdin, за да дадем вход на командата. Екземплярът на класа Popen ще ни предостави stdin обект. Има метод, наречен write, който се използва за въвеждане на командата.

  Как да използвате чат на редактора в Google Документи

Както обсъдихме по-рано, по подразбиране ще приема входове като обекти, подобни на байтове. Така че, не забравяйте да зададете текста на аргумента на ключовата дума на True, докато създавате екземпляра на Popen.

Да видим един пример.

import subprocess
process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
process.stdin.write("2 3")
process.stdin.close()
print(process.stdout.read())

анкета

Методът poll се използва за проверка дали изпълнението на командата е завършено или не. Този метод ще върне None, ако командата все още се изпълнява. Да видим един пример.

import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True)
while True:
    output = process.stdout.readline()
    if output:
    	print(output.strip())
    result = process.poll()
    if result is not None:
        break

В горния код използвахме командата ping с 5 заявки. Има безкраен цикъл, който се повтаря до завършване на изпълнението на командата. Използвахме метода poll, за да проверим състоянието на изпълнение на командата. Ако проучването на метода върне код, различен от None, тогава изпълнението завършва. И безкрайният цикъл се прекъсва.

Изпълнение на Bash скриптове

Видяхме два начина за изпълнение на командите. Сега нека да видим как да изпълним bash скриптовете в Python скриптове.

Подпроцесът има метод, наречен call. Този метод се използва за изпълнение на bash скриптовете. Методът връща изходния код от bash скрипта. Изходният код по подразбиране за bash скриптовете е 0. Нека видим пример.

Създайте bash скрипт с името practice.sh, както следва.

#!/bin/bash

echo "Hello, World!"
exit 1

Сега напишете скрипт на Python, изпълнете горния bash скрипт.

import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)

Ще получите следния резултат, след като изпълните горния скрипт на Python.

Hello, World!
1

Заключение

Видяхме как да изпълняваме bash команди и скриптове в Python. Можете да ги използвате, за да автоматизирате нещата по-ефективно.

Приятно кодиране 👨‍💻