본문 바로가기
프로그래밍 관련/파이썬

파이썬에서 배치파일 실행 - subprocess

by 존버매니아.임베디드 개발자 2023. 7. 13.
반응형

https://m.blog.naver.com/sagala_soske/222131573917

다양한 방법이 있지만 subprocess를 사용하는 방법이 있다.

import subprocess

cmd = f"test.bat -option"
process = subprocess.Popen(cmd ,shell=True)

위 코드를 실행하면
cmd 라고 적혀있는 문장을 우리가 cmd 창을 열어서 적는것과 똑같은 효과가 나타난다.
한편 Popen 함수는 여러가지 파라미터들이 더 있으니 적절하게 활용하면 좋다.


cmd 실행후 출력되는 문장 컨트롤

import subprocess

cmd = f"test.bat -option"
process = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE ,shell=True)

for output in process.stdout:
	print(output)

그 중에서 위와 같이 stdout , stderr 이라는 파라미터가 있는데
위와 같이 stdout=subprocess.PIPE , stderr=subprocess.PIPE 라고 적어주면
우리가 수행한 cmd 명령에 의해서 출력되는 문장이 있을 경우, 원래는 이것이 cmd 창에 출력이 되는데
위와 같이 코드를 수행하면 문장이 cmd 창에는 출력이 안되고 subprocess 의 stdout 변수로 넘어가게 된다.
cmd 명령으로 인해 출력되는 문장에 대한 어떤 후처리가 필요하다면, subprocess.PIPE를 활용하면 좋을 것이다.
 
위와 같은 형태로 stdout 쪽에 담겨있는 문장을 print 함수를 사용해서 다시 cmd로 출력을 보낼 수도 있다.


실행경로 지정 cwd
한편, cmd 명령어를 수행할 때, 현재 실행폴더? 실행위치? 가 이슈가 되는 경우가 있는데
무슨 말이냐면 예를 들어 test.bat 이라는 배치파일을 cmd 창에서 실행하는데
아래 파이썬 코드가 다른 폴더에 위치하고 있다면 거기서 코드를 수행해도 test.bat 파일을 찾지 못해서 수행을
할 수가 없다.
그래서 실행경로를 변경해줘야하는데 그게 바로 cwd 키워드이다.
아래와 같은 방식으로 사용하면 된다.
주의 사항이 있는데 문자열에서 \는 특수한 기능을 갖고 있어서, 폴더 경로 지정할때는 아래와 같이
\ 를 두번써서 \\라고 해줘야 한다.

import subprocess

cmd = f"test.bat -option"
cwd = f"C:\\TestFolder\\TestFolder2"
process = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd,shell=True )

for output in process.stdout:
	print(output)

with ~ as 구문과 결합
파이썬 문법중에 with ~ as라는 구문이 있는데
정확한 내용은 모르겠지만 파이썬에서 무언가 자원을 점유해서 사용하고 나서, 유저가 별도로 반환요청을 하지 않으면 해당 리소스를 계속 점유하고 있게 되는데
with as 구문을 함께 사용하면, 작업이 끝난후 자동으로 자원을 반환하는 것이라고 한다.
subprocess 의 경우 with as 형태로 사용하는 경우가 많다.
 
위에서 작성된 예시를 with as 구문 형태로 만들면 아래와 같다.

import subprocess

cmd = f"test.bat -option"
cwd = f"C:\\TestFolder\\TestFolder2"

with subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd,shell=True )as process:
    for output in process.stdout:
        print(output)

 

반응형