健壮的Python3 shebang行?

时间:2019-06-21 18:03:26

标签: python python-3.x shebang

是否可以编写shebang行,以便找到Python3解释器(如果存在)?

PEP 394开始,我天真地希望#!/usr/bin/env python3应该起作用。

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

是否有解决此歧义的可靠方法?有没有什么办法可以写出shebang行,这样它将使用python3(如果存在),而尝试使用python(如果没有)? (要求最终用户手动修复其系统以添加python3别名是不理想的。)

1 个答案:

答案 0 :(得分:2)

我能看到的唯一方法是提供自己的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

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

#!/usr/local/bin/python3_wrapper

您的另一个选择是调用同时在版本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)