shell 有没有可能构造一个同时适用于Python 2和Python 3的shebang?

ht4b089n  于 2023-03-13  发布在  Shell
关注(0)|答案(2)|浏览(138)

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

#!/usr/bin/env python

对于Python 3:

#!/usr/bin/env python3

但是,如果没有安装相应的Python版本,这两种方法都会失败,因为据我所知,安装了Python 3而没有安装Python 2的系统不会将python作为别名或符号链接到python3(如果我说错了,请纠正我)。
那么,有没有一种方法可以编写一个带有shebang的Python脚本,只要安装了Python 2或Python 3中的一个,它就可以使用Python 2或Python 3来执行脚本呢?
这主要是为了解决从即将发布的macOS * 版本中移除Python 2的问题(注:我最初写这篇文章是因为我错误地认为Python 2将在macOS中被Python 3取代,但实际上苹果正在完全删除Python。)* 但也可以适用于Linux。

y0u0uwnf

y0u0uwnf1#

实际上,我只会指定python3并将其作为先决条件。
然而,从技术上讲,可以欺骗Python文件成为自己的shell脚本 Package 器:

#!/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")
htrmnn0y

htrmnn0y2#

这似乎允许选择python3而不是python2,并且如果找到,将使用其中一个。Snagged from here,并且允许您处理一些人在他们的计算机上只安装了python2,而另一些人只安装了python3的情况

#!/usr/bin/env bash
_='''' # Prefer python3 if it exists
command -v python3 &> /dev/null && exec python3 $0 "$@" || exec python $0 "$@"
'''
# Python code here
print ("Hello")

相关问题