是否可以构建一个同时适用于 Python 2 和 3 的 shebang?

Guy*_*zmo 8 python shell shebang python-3.x

我需要编写一个与 Python 2 和 Python 3 兼容的 Python 脚本,可以直接从 shell 调用(意味着它有一个 shebang),并且可以在安装了任一 Python 版本(但可能不能同时安装)的系统上运行。

通常我可以为 Python 2 编写一个 shebang,如下所示:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

对于 Python 3:

#!/usr/bin/env python3
Run Code Online (Sandbox Code Playgroud)

但如果未安装相应的 Python 版本,这两种方法都会失败,因为据我所知,具有 Python 3 但不具有 Python 2 的系统不会别名或符号链接pythonpython3. (如果我错了,请纠正我。)

那么有没有一种方法可以使用 shebang 编写 Python 脚本,只要安装了其中一个,就可以使用 Python 2 或 Python 3 执行脚本?

这主要是为了解决从即将发布的 macOS 版本中删除 Python 2 的问题, (注:我最初是在错误的理解下写的,认为 Python 2 将在 macOS 中被 Python 3 取代,但实际上 Apple 正在完全删除 Python。)但也适用于 Linux。

tha*_*guy 9

实际上,我只是指定python3并使其成为先决条件。

然而,从技术上来说,可以欺骗 Python 文件使其成为它自己的 shell 脚本包装器:

#!/bin/sh
''':'
for name in python3 python2 python
do
    type "$name" > /dev/null 2>&1 && exec "$name" "$0" "$@"
done
echo >&2 "Please install python"
exit 1
':'''

print("Hello from Python")
Run Code Online (Sandbox Code Playgroud)