파이썬으로 개발을 하게되면 버전 문제가 발생한다. 파이썬 2.x 버전과 3.x 버전 사이에 약간의 호환성 문제와 문법 문제가 있어서 어떤 버전의 파이썬에서 프로그램을 실행할지가 중요하다.
문제는 파이썬 스크립트를 실행할 사용자 환경에 어떤 버전이 설치되어 있을지 모른다는 것이다. 파이썬 3.x 기준으로 작성된 스크립트를 사용자 환경에서 파이썬 2.x 인터프리터가 실행하면 오류가 발생할 수 있다.
이럴 때 파이썬 스크립트에 '셔뱅(Shebang)'을 이용해서 사용할 인터프리터의 경로를 지정할 수 있다.
셔뱅(Shebang)
리눅스에서 실행되는 스크립트 파일의 첫 번째 줄에는 '#!'로 시작하는 코드가 있다. Bash 스크립트나 파이썬 스크립트에서 자주 찾아볼 수 있다. 이 코드를 '셔뱅(Shebang)'이라고 한다.
셔뱅은 'Sharp(#)' + 'Bang(!)'의 합성어라고 한다. 샤-뱅, 해시뱅, 파운드-뱅, 해시-플링, 크런치뱅 등으로 불리기도 한다. (링크 : 셔뱅 - 위키피디아)
#!interpreter [optional-arg]
셔뱅은 스크립트 파일을 해석할 인터프리터의 경로와 옵션들을 명시할 때 사용한다. Bash 스크립트를 작성할 때, #!/bin/bash 라는 코드를 맨 첫번째 줄에 넣어준 것을 기억할 수 있다. 이 스크립트를 '#!/bin/bash'를 통해 실행하겠다는 의미다.
'#!'라는 매직 바이트를 시작으로 뒤 쪽에 인터프리터의 경로를 적어주고, 필요하다면 인터프리터를 위한 인자들을 그 뒤에 적어두면 된다. 인터프리터의 경로는 절대경로를 사용해야하며, 인자를 적는 부분은 옵션이므로 안써도 동작한다.
셔뱅(Shebang)의 사용예를 들어보면,
#!/bin/bash
#!/bin/csh -f
#!/usr/bin/perl -T
#!/usr/bin/python
#!/usr/bin/php
이런식으로 인터프리터 경로와 옵션을 인자로 넘겨 줄 수 있다.
셔뱅의 매직 바이트가 '#' 문자로 시작하는 이유는 많은 인터프리터 언어에서 '#' 문자가 주석으로 사용되기 때문이라고 한다. 때문에 실제 스크립트 편집기에서 셔뱅 부분이 주석처럼 처리가되어 가독성을 해치지 않는다.
env 명령을 이용한 셔뱅
스크립트를 작성할 때 만날 수 있는 문제점 중 하나는 인터프리터의 설치 경로가 실행할 환경마다 다를 수 있다는 점이다. 셔뱅을 통해서 인터프리터 경로를 지정할 수 있다고 했다. 다만 이 인터프리터의 경로는 절대경로여야한다. 어떤 환경에서는 파이썬이 '/bin/python'에 설치되어 있고, 또 다른 환경에서는 '/usr/bin/python'으로 설치되어 있는 경우가 있다. 파이썬 스크립트의 셔뱅부분에 둘 중 하나를 써넣으면 다른 한쪽은 실패할 가능성이 높다.
이 때, 사용하라고 만들어 놓은 명령이 'env' 명령이다. env 명령을 이용하면 어느 정도 유연하게 스크립트를 실행할 수 있다.
#!/usr/bin/env python
#!/usr/bin/env bash
#!/usr/bin/env php
'#!/usr/bin/env {언어이름}' 형식의 셔뱅을 사용하면 해당 인터프리터가 설치되어 있는 경로를 찾아서 실행한다.
마치 터미널에서 명령어를 입력하면 $PATH 환경변수에서 명령어의 경로를 찾아서 실행해주는 것처럼 셔뱅에 'env + python'을 입력하면 $PATH 환경변수에서 python이라는 이름의 바이너리를 찾은 다음 실행에 사용하게 된다. 따라서 실행 환경의 PATH 환경변수만 잘 지정해주면 스크립트 실행에는 큰 문제가 없게 된다.
파이썬 버전 설정하기
파이썬 2.x 와 파이썬 3.x 버전이 모두 설치되어 있는 환경에서 스크립트가 어떤 버전으로 실행되어야 할지 명시하는것이 중요하다.
#!/usr/bin/env python2
or
#!/usr/bin/env python3
이 처럼 파이썬 스크립트의 셔뱅에 바이너리 버전을 명시해주면 env 명령이 알아서 해당 버전의 파이썬 인터프리터를 찾아서 구동시켜 준다.
댓글