우리는 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