Shebang을 사용하여 Python 버전을 구별하는 방법

Shebang을 사용하여 Python 버전을 구별하는 방법

우리는 Python의 다양한 버전을 가지고 있습니다 module load. 이는 일반 Python 2 또는 3 설치일 수 있습니다.파이썬추가 라이브러리가 많은 버전입니다.

현재 특정 Python 설치( 를 사용하여 찾은)를 사용해야 하는 스크립트를 작성하는 경우 명시적인 경로를 사용해야 module load python/ana ; which python합니다 . #!예를 들어

#!/path/to/anaconda/1.7.0/64/bin/python

module load python/anaconda지금 로드한 Python의 현재 버전을 가리킵니다 .

하지만 이 모듈은 제가 관리하는 것이 아니기 때문에 누군가 사용할 모듈을 업데이트한 /path/to/anaconda/1.7.1/64/bin/python다음 1.7.0을 제거하면 제 스크립트가 작동을 멈춥니다.

사용할 인터프리터와 인터프리터를 로드해야 하는 모듈을 지정하는 표준 방법이 스크립트에 있습니까? 그것은 마치

#!/blah/module_env python/anaconda python -c

아니면 루트 액세스가 필요하지 않은 다른 옵션이 있습니까? 우리의 엔터프라이즈 Linux 시스템은 잠겨 있으므로 자체 소프트웨어를 설치하거나 구성을 변경할 수 없으며 제공된 소프트웨어 /use/bin/env만 사용할 수 있습니다 .module load

답변1

나는 당신의 소프트웨어에 익숙하지 않지만 module다음과 같은 작업을 수행할 수 있을 것 같습니다.

#! /bin/sh -
'eval' '. "$MODULES_HOME/init/sh"; module load something || exit; exec python -- "$0" "$@"'

python script follows

먼저 해석된 sh다음 동일한 매개변수를 사용하여 동일한 스크립트에서 호출 및 실행됩니다 module.python

처음 두 줄은 무시됩니다 python. 첫 번째는 주석이기 때문에 두 번째는 단지 두 문자열을 연결하기 때문입니다.

더 일반적으로:

#! /bin/sh -
'eval' 'single-line-of-shell-code-with-no-single-quote; exec python -- "$0" "$@"'

python미리 실행되는 일부 주요 쉘 코드를 사용하여 실행 가능한 스크립트를 얻는 일반적인 방법입니다 . 여러 줄로 구성된 셸 코드의 경우 python' 따옴표를 사용할 수도 있습니다 '''...'''.

#! /bin/sh -
':' '''python script with shell preamble'

arbitrary shell code here provided it doesn't contain
a sequence of 3 single quotes.

exec python -- "$0" "$@"
'''

print("Hello World")

그래서 여기 있습니다:

#! /bin/sh -
':' '''python script with shell preamble'
"$MODULES_HOME/init/sh"
module load something || exit
exec python -- "$0" "$@"
'''

python script follows

관련 정보