Python을 사용하여 bash 스크립트를 실행하는 방법은 무엇입니까?

Linux를 사용하고 있다면 분명히 쉘 명령을 좋아할 것입니다.

Python으로 작업하는 경우 자동화를 시도했을 수 있습니다. 시간을 절약할 수 있는 방법입니다. 작업을 자동화하는 bash 스크립트가 있을 수도 있습니다.

Python은 bash보다 스크립트 작성에 편리합니다. 그리고 Python 스크립트 관리는 bash 스크립트에 비해 쉽습니다. bash 스크립트가 일단 성장하면 유지 관리하기가 어렵다는 것을 알게 될 것입니다.

그러나 Python을 사용하여 실행하려는 bash 스크립트가 이미 있는 경우에는 어떻게 될까요?

Python에서 bash 명령과 스크립트를 실행할 수 있는 방법이 있습니까?

예, Python에는 Python 스크립트 내에서 명령과 스크립트를 실행하는 데 사용되는 subprocess라는 내장 모듈이 있습니다. Python 스크립트에서 bash 명령과 스크립트를 실행하는 방법을 자세히 알아보겠습니다.

Bash 명령 실행

이미 본 것처럼 모듈 하위 프로세스는 bash 명령과 스크립트를 실행하는 데 사용됩니다. 동일한 방법과 클래스를 제공합니다.

주로 서브프로세스 모듈에서 알아야 할 하나의 메소드와 하나의 클래스가 있습니다. 그들은 실행하고 Popen입니다. 이 두 가지는 Python 스크립트에서 bash 명령을 실행하는 데 도움이 됩니다. 하나씩 살펴보겠습니다.

subprocess.run()

subprocess.run() 메서드는 문자열 목록을 위치 인수로 사용합니다. 이것은 bash 명령과 이에 대한 인수가 있으므로 필수입니다. 목록의 첫 번째 항목은 명령 이름이고 나머지 항목은 명령에 대한 인수입니다.

간단한 예를 살펴보겠습니다.

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

위의 스크립트는 스크립트가 있는 그대로 현재 작업 디렉토리의 모든 항목을 나열합니다. 위 스크립트에는 명령에 대한 인수가 없습니다. 우리는 bash 명령만 주었습니다. -l, -a, -la 등과 같은 추가 인수를 ls 명령에 제공할 수 있습니다.

명령 인수가 있는 간단한 예를 살펴보겠습니다.

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

위의 명령은 권한과 함께 숨김 파일을 포함한 모든 파일을 표시합니다. 파일 및 디렉토리 추가 정보 및 숨겨진 파일을 표시하는 인수 la를 제공했습니다.

  Chromium OS로 나만의 크롬북 만드는 방법

명령을 작성하는 동안 몇 가지 실수를 범할 수 있습니다. 실수에 따라 오류가 발생합니다. 캡처하여 나중에 사용하려면 어떻게 해야 합니까? 예, 키워드 인수 stderr을 사용하여 그렇게 할 수 있습니다.

예를 들어 보겠습니다.

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

작업 디렉토리에 이름이 sample.txt인 파일이 없는지 확인하십시오. 키워드 인수 stderr에 대한 값은 개체에서 오류를 반환하는 데 도움이 되는 PIPE입니다. 나중에 같은 이름으로 액세스할 수 있습니다. 그리고 키워드 인자 text는 출력이 문자열이어야 한다는 것을 알려주는 데 도움이 됩니다.

마찬가지로 stdout 키워드 인수를 사용하여 명령의 출력을 캡처할 수 있습니다.

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

subprocess.run() – 입력

입력 키워드 인수를 사용하여 명령에 입력을 제공할 수 있습니다. 문자열 형식으로 입력을 제공합니다. 따라서 키워드 인수 텍스트를 True로 설정해야 합니다. 기본적으로 바이트 단위로 사용합니다.

예를 들어 보겠습니다.

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

위의 프로그램에서 Python 스크립트 add.py는 두 개의 숫자를 입력으로 사용합니다. input 키워드 인수를 사용하여 Python 스크립트에 입력을 제공했습니다.

subprocess.Popen()

subprocess.Popen() 클래스는 subprocess.run() 메서드보다 고급입니다. 명령을 실행할 수 있는 더 많은 옵션을 제공합니다. subprocess.Popen()의 인스턴스를 만들고 명령 실행 상태 파악, 출력 가져오기, 입력 제공 등과 같은 다양한 작업에 사용할 것입니다.

우리가 알아야 할 subprocess.Popen() 클래스의 여러 메소드가 있습니다. 코드 예제와 함께 하나씩 살펴보겠습니다.

기다리다

명령 실행이 완료될 때까지 기다리는 데 사용됩니다. Python 스크립트의 다음 줄은 wait 메서드 뒤에 작성된 이전 명령이 완료될 때까지 실행되지 않습니다. 예제를 보자.

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

위의 코드를 실행하고 출력을 관찰하십시오. 완료 메시지가 표시됩니다! 명령을 실행하기 전에 인쇄됩니다. wait 메소드를 사용하여 피할 수 있습니다. 명령이 완료될 때까지 기다리자.

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

print("Completed!")

위 코드의 출력을 보면 wait가 실제로 작동하고 있다는 것을 알게 될 것입니다. print 문은 명령 실행이 완료된 후 실행됩니다.

  랜섬웨어에서 살아남고 싶으십니까? PC를 보호하는 방법은 다음과 같습니다.

의사소통하다

통신 방법은 출력, 오류를 가져오고 명령에 입력을 제공하는 데 사용됩니다. 출력과 오류를 각각 포함하는 튜플을 반환합니다. 예를 들어 보겠습니다.

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라는 메소드가 있습니다.

앞에서 논의했듯이 기본적으로 바이트열류 객체로 입력을 받습니다. 따라서 Popen의 인스턴스를 생성하는 동안 키워드 인수 텍스트를 True로 설정하는 것을 잊지 마십시오.

예를 들어 보겠습니다.

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

위의 코드에서는 5개의 요청과 함께 ping 명령을 사용했습니다. 명령 실행이 완료될 때까지 반복되는 무한 루프가 있습니다. 명령 실행 상태를 확인하기 위해 poll 메서드를 사용했습니다. poll 메서드가 None 이외의 코드를 반환하면 실행이 완료됩니다. 그리고 무한 루프가 끊어집니다.

Bash 스크립트 실행

우리는 명령을 실행하는 두 가지 방법을 보았습니다. 이제 Python 스크립트에서 bash 스크립트를 실행하는 방법을 살펴보겠습니다.

하위 프로세스에는 호출이라는 메서드가 있습니다. 이 메소드는 bash 스크립트를 실행하는 데 사용됩니다. 이 메서드는 bash 스크립트에서 종료 코드를 반환합니다. bash 스크립트의 기본 종료 코드는 0입니다. 예제를 살펴보겠습니다.

다음과 같이 이름이 practice.sh인 bash 스크립트를 만듭니다.

#!/bin/bash

echo "Hello, World!"
exit 1

이제 위의 bash 스크립트를 실행하는 Python 스크립트를 작성하십시오.

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

위의 Python 스크립트를 실행하면 다음 출력을 얻을 수 있습니다.

Hello, World!
1

결론

우리는 파이썬에서 bash 명령과 스크립트를 실행하는 방법을 보았습니다. 이를 사용하여 작업을 보다 효율적으로 자동화할 수 있습니다.

  이 10가지 도구로 고유한 비즈니스 이름 생성

해피코딩 👨‍💻