"python myscript" 忽略 pythonX 不存在的“#!/usr/bin/env pythonX”

"python myscript" ignores "#!/usr/bin/env pythonX" where pythonX doesn't exist

为什么 test.py 未安装 Python 3 时不会抛出错误 env: python3: No such file or directory

我的系统 (Mac OS X) 安装了 Python 2.7,但没有安装 Python 3:

$ /usr/bin/env python -V
Python 2.7.12
$ /usr/bin/env python3 -V
env: python3: No such file or directory

文件test.py:

#!/usr/bin/env python3
import sys
print sys.executable

正在执行test.py:

$ python test.py
/usr/local/opt/python/bin/python2.7

我认为由于 Python 3 在我的系统上不存在,所以使用 shebang 行 #!/usr/bin/env python3 将抛出错误并终止脚本。但是 env 实际上选择了 Python 2.7 解释器。

shebang 在尝试执行脚本时由 OS 解释。当你键入 python test.py 时,OS 执行 python 并且 python 执行脚本(并且 python 是根据当前的 PATH 找到的)作为反对被 OS.

处理

如果您使脚本可执行 (chmod +x test.py) 然后尝试直接执行它 (例如 ./test.py),OS 将负责 运行ning脚本,因此它将查看 shebang 以确定哪个程序对 运行 脚本负责。在这种情况下,/usr/bin/env 将查找 python3 并尝试使用它。由于 python3 不存在(或在您的 PATH 上找不到),您将看到错误。

仅当您直接对文件执行 test.py、运行 而不是 运行 python 并以 test.py 作为参数时,才会处理 shebang。当您执行 python test.py 时,Python 会完全忽略 shebang 行。