强大的Python3 shebang线?

R.M*_*.M. 7 python shebang python-3.x

有没有办法编写 shebang 行,以便它可以找到 Python3 解释器(如果存在)?

天真地,从PEP 394 开始,我希望这#!/usr/bin/env python3应该可行。

但是,我注意到在某些使用pythonPython3 的系统上,它们不提供python3别名。在这些系统上,您需要使用#!/usr/bin/env python来获取 Python3。

有没有一种强大的方法来处理这种歧义?有没有办法编写shebang行,以便它python3在存在时使用,但python如果没有则尝试?(要求最终用户手动修复他们的系统以添加python3别名并不理想。)

Dal*_*son 3

我能想到的唯一方法是提供您自己的 shebang 包装器来调用正确版本的 python。如果您可以可靠地将包装纸放置在设定位置,您可以执行以下操作:

创建包装器脚本,例如 /usr/local/bin/python3_wrapper

#!/bin/bash
cmd="$1"
shift
if which python3 >/dev/null; then
  exec python3 "$cmd" "$@"
elif which python >/dev/null; then
  version=$(python --version 2>&1 | cut -d' ' -f2 | cut -d. -f1)
  if [[ "$version" == "3" ]]; then
    exec python "$cmd" "$@"
  else
    echo "python is version $version (python3 not found)"
  fi
else
  echo "python3 nor python found"
fi
exit 1
Run Code Online (Sandbox Code Playgroud)

然后在脚本中使用以下 shebang:

#!/usr/local/bin/python3_wrapper
Run Code Online (Sandbox Code Playgroud)

您的另一个选择是调用一个在版本 2 和 3 中都可以工作的 python 脚本,然后使用正确的可执行文件调用您的 python3 脚本。如果您的脚本名为 script.py,则将其重命名为 script.py3 并创建 script.py,如下所示:

#!/usr/bin/env python

import os
import sys

if sys.version_info.major == 3:
    exe = "python"    # python is version 3.x
else:
    exe = "python3"   # python is not version 3.x so try python3
try:
    os.execvp(exe, [exe, sys.argv[0]+'3'] + sys.argv[1:])
except:
    print(exe, "not found")
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)