ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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모듈을 사용하여 명령을 내리는 방법을 추천합니다.

    댓글