5.6. Python 스크립트에서 인터프리터 지시문 처리

Red Hat Enterprise Linux 9에서는 실행 가능한 Python 스크립트는 최소 주요 Python 버전에서 명시적으로 지정하는 인터프리터 지시문( hashbangs 또는 shebangs라고도 함)을 사용해야 합니다. 예를 들어 다음과 같습니다.

#!/usr/bin/python3
#!/usr/bin/python3.9
#!/usr/bin/python3.11

RPM 패키지를 빌드할 때 /usr/lib/rpm/redhat/brp-mangle-shebangs BRP(Buildroot 정책) 스크립트를 자동으로 실행하고 모든 실행 파일에서 인터프리터 지시문을 수정하려고 시도합니다.

BRP 스크립트는 다음과 같은 모호한 인터프리터 지시문을 사용하여 Python 스크립트를 시작할 때 오류를 생성합니다.

#!/usr/bin/python

또는

#!/usr/bin/env python

5.6.1. Python 스크립트에서 인터프리터 지시문 수정

다음 절차에 따라 RPM 빌드 시 빌드 오류가 발생하는 Python 스크립트에서 인터프리터 지시문을 수정합니다.

사전 요구 사항

  • Python 스크립트의 인터프리터 지시문 중 일부는 빌드 오류가 발생합니다.

절차

  • 인터프리터 지시문을 수정하려면 다음 작업 중 하나를 완료합니다.

    • SPEC 파일의 %prep 섹션에서 다음 매크로를 사용합니다.

      # %py3_shebang_fix SCRIPTNAME …​

      SCRIPTNAME 은 모든 파일, 디렉터리 또는 파일 및 디렉터리 목록일 수 있습니다.

      결과적으로 나열된 디렉터리의 모든 파일 및 모든 .py 파일은 %{python3} 을 가리키도록 인터프리터 지시문을 수정합니다. 원래 인터프리터 지시문의 기존 플래그는 보존되고 %{py3_shebang_flags} 매크로에 정의된 추가 플래그가 추가됩니다. SPEC 파일에서 %{py3_shebang_flags} 매크로를 재정의하여 추가할 플래그를 변경할 수 있습니다.

    • python3-devel 패키지에서 pathfix.py 스크립트를 적용합니다.

      # pathfix.py -pn -i %{python3} PATH …​

      여러 경로를 지정할 수 있습니다. PATH 가 디렉터리인 경우 pathfix.py 는 모호한 인터프리터 지시문이 있는 것뿐만 아니라 ^[a-zA-Z0-9_]+\.py$ 패턴과 일치하는 Python 스크립트를 반복적으로 검사합니다. 위의 명령을 %prep 섹션에 추가하거나 %install 섹션의 끝에 추가합니다.

    • 패키지된 Python 스크립트를 수정하여 예상 형식을 준수하도록 합니다. 이를 위해 RPM 빌드 프로세스 외부의 pathfix.py 스크립트도 사용할 수 있습니다. RPM 빌드 외부에서 pathfix.py 를 실행하는 경우 이전 예제의 %{python3}/usr/bin/python3 또는 /usr/bin/python3.11 과 같은 인터프리터 지시문의 경로로 바꿉니다.

추가 리소스