파이썬은 인터프리터 언어다. 따라서 별도의 컴파일 과정 없이 파이썬 인터프리터 프로그램 python(python2 또는 python3)을 실행하며 그 인자로 파일의 경로를 작성하면 스크립트가 쭉 실행된다(from3). 이말은 곧 스크립트 언어는 인터프리터의 버전에 종속적이라는 말이기도 하다.

환경 종속성을 피하기 위해 도커를 사용하는 방법 등을 고려할 수 있겠지만(from2), 의존성이 충분히 작아 직관적으로 관리가 가능한 작은 프로젝트를 진행할 때 도커 환경을 세팅하는 일은 상당히 번거로울 수 있다. 이럴 때 커맨드라인에서 사용하는 스크립트를 축약하기 위한 목적으로 Makefile(from1)이나 셸 스크립트를 사용하곤 한다. 하지만 Makefile 이나 셸 스크립트와 같이 격리환경을 전제하지 않는 경우 여전히 런타임 실행 환경(python 의 실행 경로, python 의 버전 등)을 엄격하게 규정하지 못한다.

소스코드를 작성할 때 가장 간단하게 런타임 환경을 제약하는 방법은 스크립트 최상단에 셔뱅라인을 추가하는 것이다. 스크립트의 셔뱅 줄에 python 를 실행하도록 아래와 같이 명세해 두면 유저가 python main.py 와 같이 커맨드라인에 입력하는 대신 ./main.py 만 입력하면 프로그램을 실행하게 된다.

#!/usr/bin/python

하지만 아직 많은 시스템에서는 python 실행 파일이 python2 의 심볼릭 링크인 경우도 있고(from4:리눅스에서 프로그램을 실행하는 방법), python3 의 심볼릭 링크인 경우도 있다. python 을 많이 다루어 본 개발자라면 이 문제를 금방 파악할 테지만, 그렇지 않을 가능성은 여전히 높다. 아래와 같이 인터프리터의 버전을 지정하자.

#!/usr/bin/python3

뿐만 아니라 Makefile은 도커와 달리 일정한 운영체제 환경을 담보하지 않는다. 이말은 곧 python3 실행 파일이 /usr/bin/python3 에 위치해 있는지, /bin/python3 에 위치해 있는지 알 방법이 없다는 말이다. 모든 소스코드는 반드시 훨씬 안정적인 것에 종속적이어야 한다. 이 문제를 회피하기 위한 정답은 환경 변수만이 알고 있다. 아래와 같은 쉬뱅을 사용하여 환경 변수가 python3 에 해당하는 적절한 실행 파일을 들고 오도록 만들자(참고1).

#!/usr/bin/env python3

이때 셔뱅 라인에서 사용된 /usr/bin/env 는 별다른 것이 아니라 리눅스와 같은(from5) unix-like 시스템(Unix-like)에서 환경 변수를 다룰 때 사용할 수 있는 프로그램이다(참고2).


왜 셔뱅 라인에 python3 만 쓰면 안되고 /usr/bin/env 를 작성해야 하는가?


parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.

  1. None

from : 과거의 어떤 생각이 이 생각을 만들었는가?

  1. [bb2.1_1.1_1. title: 굳이 소스코드를 묶기 위해 Makefile을 쓸 필요는 없다. Makefile이 코드형 인프라(Infrastructure as Code (IaC))의 표준인 것은 아니다.](https://janghoo.notion.site/bb2-1_1-1_1-title-Makefile-Makefile-493d6c5ff5e842739e55f677da6a1a5a)
  2. bc6_1. [entry] title: 도커파일을 구성하는 명령어들은 내(호스트) 환경과 격리된 환경인 도커 환경 사이의 관계를 정의하기도 하고, 이미지 환경 자체를 정의하기도 하고, 컨테이너 환경에서 수행해야 하는 작업을 정의하기도 한다.