-
[Python] os.system()으로 bash 내부 명령어 실행하기언어/파이썬 & 장고 2016. 12. 6. 16:22
os.system()로 리눅스 내 명령어를 실행할 경우가 있습니다. 이때 공통적인 ls 나 cd .. , mkdir 등 기본 명령어는 바로 사용이 되지만 bash 내에만 존재하는 명령어를 실행하려할 때 (가령, source, shopt 명령어) 해당 명령어를 인식하지 못합니다.
os.system()으로 실행하면 Bourne shell을 기본으로하기 때문입니다.
#!/bin/bash # <- source와 같은 명령어는 bash 내의 쉘에만 존재 #!/bin/sh # <-os.system()으로 실행하면 해당 쉘이 실행
여기서 bash 쉘을 실행하는 방법은 다음과 같습니다.
subprocess 모듈
subprocess 모듈을 사용하여 bash 쉘을 실행하는 방법은 아래와 같습니다.
# vol 1 import subprocess sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"]) sp.communicate() # 위의 코드는 리눅스에서 nuke -x scriptpath 명령어를 입력한 것과 같습니다. # vol 2 import subprocess subprocess.call('/bin/bash -c "$GREPDB"', shell=True, env={'GREPDB': 'echo 123'}) # 위 코드는 리눅스에서 echo 123을 입력한 것과 같습니다.
os.system() 그대로 사용
os.system()은 Bourne shell을 기본으로 사용하지만 세미콜론(;)을 사용하여 bash 쉘을 실행시킬 수 있습니다.
# vol 1 SOURCE='source $HOME/.bashrc'; /bin/bash -c '$SOURCE # SOURCE 변수에 source $HOME/.bashrc 명령어를 스트링으로 저장한 뒤 bash 쉘로 해당 변수를 호출하여 실행 # vol 2 /bin/bash -c 'source ~/.bash_profile' # 만약 ''로 bash 쉘로 실행할 명령을 묶지 않으면 에러발생
두 가지 방법이 있지만 os.system()을 사용해서 리눅스 내 명령을 하는 것보단 subprocess모듈을 사용하여 명령을 내리는 방법을 추천합니다.