如何使用 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

或者,还有其他不需要 root 访问权限的选项吗?我们的企业 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脚本的通用方法,其中预先运行一些前导 shell 代码。对于多行 shell 代码,您还可以使用python's'''...'''引号:

#! /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

相关内容