如何编写将调用 python3 或 python2 的 shebang 行
How to write a shebang line that will call either either python3 or python2 whichever is available
流行的 linux 发行版的最新版本默认选择不安装任何 python
命令。这使得编写适用于旧系统和新系统的可移植脚本变得异常困难。
臭味选项:
- 在打包或安装时重写脚本
- 强制用户使用版本化 python 解释器专门调用脚本
- 期望用户有 运行 更新选项或类似选项
有没有一种方法可以编写仅使用通常安装的标准 linux 标准工具的 shebang #!
行,并且可以 运行 python3
、python2
, 或 python
?
我想要 env
命令的虚构 --choices
参数
#!/usr/bin/env --choices python3,python2,python
但这当然不存在。
基于 的想法,您可以这样做:
#!/bin/bash
'''':
for interpreter in python3 python2 python
do
which $interpreter >/dev/null 2>&1 && exec $interpreter "[=10=]" "$@"
done
echo "[=10=]: No python could be found" >&2
exit 1
# '''
import sys
print(sys.version)
流行的 linux 发行版的最新版本默认选择不安装任何 python
命令。这使得编写适用于旧系统和新系统的可移植脚本变得异常困难。
臭味选项:
- 在打包或安装时重写脚本
- 强制用户使用版本化 python 解释器专门调用脚本
- 期望用户有 运行 更新选项或类似选项
有没有一种方法可以编写仅使用通常安装的标准 linux 标准工具的 shebang #!
行,并且可以 运行 python3
、python2
, 或 python
?
我想要 env
命令的虚构 --choices
参数
#!/usr/bin/env --choices python3,python2,python
但这当然不存在。
基于 的想法,您可以这样做:
#!/bin/bash
'''':
for interpreter in python3 python2 python
do
which $interpreter >/dev/null 2>&1 && exec $interpreter "[=10=]" "$@"
done
echo "[=10=]: No python could be found" >&2
exit 1
# '''
import sys
print(sys.version)