파이썬으로 프로그래밍을 하다보면 Windows 의 CMD나 Linux의 Bash 처럼 Shell 명령어를 사용해야 하는 경우가 있다.
쉘 스크립트를 따로 만들어 실행하는 방법도 있지만 파이썬 내부에서 처리를 하는게 관리 측면에서 간편할 것 같다.
파이썬에서 시스템 명령어를 사용하는 방법들을 아래와 같다.
os.system()
가장 보편적으로 사용되는 방법이다. 이름에서 짐작하겠지만 C언어에 systeml() 함수와 동일한 역할은 한다.
import os
import subprocess
os.system('echo Hello SYSTEM')
실제 파이썬 코드에서는 위 명령어를 사용하면 'Hello SYSTEM' 이란 문구가 출력되는걸 확인 할 수 있다. 예제의 경우에는 주피터 노트북을 사용해 진행했기 때문에 백그라운드에서 명령어가 성공했을 경우 리턴되는 값이 출력된다.
subprocess.call()
실제 파이 os.system 이 쉘에서 직접 명령어를 입력하는 경우라면 subprocess 를 사용하는 함수들의 경우에는 별도의 하위 프로세스를 만들어 명령어를 호출하는 것이라 생각하면 된다. 아래처럼 call 함수로 동일한 효과를 낼 수 있다.
result_call = subprocess.call('echo Hello CALL', shell=True)
print(result_call)
이 경우에도 백그라운드에서 리턴되는 값은 명령어의 성공여부이다.
subprocess.run()
subprocess.run의 기본적인 사용방법은 아래과 같은데 명령어 + 인자값(실행옵션)의 형태라고 이해하면 된다.
subprocess.run(['echo', 'Hello RUN'], shell=True, encoding='utf-8')
리턴되는 값의 형태는 명령어가 실행된 프로세스의 실행결과를 나타내주고 있는데 앞의 두 경우보다 조금 더 상세하다.
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에 저장된 값을 출력한 결과이다. 앞의 세경우와는 다르게 우리가 실제로 명령어를 실행했을 때 보게되는 문구가 출력된 것을 확인 할 수 있다.
subprocess.check_output()
파이썬 3.8 미만 버전을 사용하는 경우 위의 capture_output 인자를 사용했을 때 에러가 날 수 있다. 이럴 경우 구버전에서 사용하던 subprocess.check_ouput 함수를 사용해 동일한 효과를 낼 수 있다. 사용법도 앞의 예처럼 명령어와 옵션을 구분할 필요가 없어 간편하다.
subprocess.check_output('echo Hello CHECK_OUTPUT', shell=True, encoding='utf-8')
확인되는 결과값도 동일하게 명령어 실행 결과가 나오는 것을 볼 수 있다.
result_check = subprocess.check_output('echo Hello CHECK_OUTPUT', shell=True, encoding='utf-8')
print(result_check)
echo의 경우 shell=False로 설정하면 에러가 나는 부분이 있어서 True 했지만 커맨드인젝션 방어를 위해서는 False 사용을 권장한다.
좀 더 자세한 내용은 아래 파이선 매뉴얼을 통해 확인 할 수 있다.
'Programming > 코딩 짤팁' 카테고리의 다른 글
Selenium 으로 티스토리 자동 로그인 (0) | 2022.01.06 |
---|---|
티스토리 API Access token 자동 발급 받기 업데이트 (4) | 2020.09.25 |
IP address / Domain / URL 구분하기 with 파이썬 (0) | 2020.09.25 |
파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급 (8) | 2020.06.19 |
파이썬으로 첨부파일이 있는 gmail 보내기 (0) | 2020.05.20 |