본문 바로가기

Programming/코딩 짤팁

파이썬에서의 쉘 or 시스템 명령어 사용 (CMD / BASH...)

파이썬으로 프로그래밍을 하다보면 Windows 의 CMD나 Linux의 Bash 처럼 Shell 명령어를 사용해야 하는 경우가 있다.

쉘 스크립트를 따로 만들어 실행하는 방법도 있지만 파이썬 내부에서 처리를 하는게 관리 측면에서 간편할 것 같다.

파이썬에서 시스템 명령어를 사용하는 방법들을 아래와 같다.

os.system()

가장 보편적으로 사용되는 방법이다. 이름에서 짐작하겠지만 C언어에 systeml() 함수와 동일한 역할은 한다.

import os
import subprocess

os.system('echo Hello SYSTEM')

실제 파이썬 코드에서는 위 명령어를 사용하면 'Hello SYSTEM' 이란 문구가 출력되는걸 확인 할 수 있다. 예제의 경우에는 주피터 노트북을 사용해 진행했기 때문에 백그라운드에서 명령어가 성공했을 경우 리턴되는 값이 출력된다.

0

subprocess.call()

실제 파이 os.system 이 쉘에서 직접 명령어를 입력하는 경우라면 subprocess 를 사용하는 함수들의 경우에는 별도의 하위 프로세스를 만들어 명령어를 호출하는 것이라 생각하면 된다. 아래처럼 call 함수로 동일한 효과를 낼 수 있다. 

result_call = subprocess.call('echo Hello CALL', shell=True)
print(result_call)

이 경우에도 백그라운드에서 리턴되는 값은 명령어의 성공여부이다.

0

subprocess.run()

subprocess.run의 기본적인 사용방법은 아래과 같은데 명령어 + 인자값(실행옵션)의 형태라고 이해하면 된다.

subprocess.run(['echo', 'Hello RUN'], shell=True, encoding='utf-8')

리턴되는 값의 형태는 명령어가 실행된 프로세스의 실행결과를 나타내주고 있는데 앞의 두 경우보다 조금 더 상세하다.

CompletedProcess(args=['echo', 'Hello RUN'], returncode=0)

subprocess.run 부터는 capture_output 인자를 True로 해줄 경우 실행된 결과를 stdout 인자에 저장하게 된다.

result_sub = subprocess.run(['echo', 'Hello RUN'], shell=True, capture_output=True, encoding='utf-8')
print(result_sub.stdout)

stdout에 저장된 결과값들만 별도의 파일이나 변수로 다시 저장하여 점검 등 다른 용도로 사용 할수도 있다. 아래는 stdout에 저장된 값을 출력한 결과이다. 앞의 세경우와는 다르게 우리가 실제로 명령어를 실행했을 때 보게되는 문구가 출력된 것을 확인 할 수 있다.

"Hello RUN"

subprocess.check_output()

파이썬 3.8 미만 버전을 사용하는 경우 위의 capture_output 인자를 사용했을 때 에러가 날 수 있다. 이럴 경우 구버전에서 사용하던 subprocess.check_ouput 함수를 사용해 동일한 효과를 낼 수 있다. 사용법도 앞의 예처럼 명령어와 옵션을 구분할 필요가 없어 간편하다.

subprocess.check_output('echo Hello CHECK_OUTPUT', shell=True, encoding='utf-8')

확인되는 결과값도 동일하게 명령어 실행 결과가 나오는 것을 볼 수 있다.

'Hello CHECK_OUTPUT\n'

변수에 저장하여 출력하는것도 stdout 사용없이 바로바로 확인 가능하다. 

result_check = subprocess.check_output('echo Hello CHECK_OUTPUT', shell=True, encoding='utf-8')
print(result_check)

echo의 경우 shell=False로 설정하면 에러가 나는 부분이 있어서 True 했지만 커맨드인젝션 방어를 위해서는 False 사용을 권장한다.

Hello CHECK_OUTPUT

좀 더 자세한 내용은 아래 파이선 매뉴얼을 통해 확인 할 수 있다.

 

subprocess — Subprocess management — Python 3.8.3 documentation

subprocess — Subprocess management Source code: Lib/subprocess.py The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and

docs.python.org