起初是看到《Python编程:从入门到实践(第2版)》新增内容,本来是想试验一下Pyhton3.8 以上版本的 f 字符串功能,但过程中学到了各种各样的东西就记录一下。本片为第一篇 Shebang 相关的文章。
Shebang
Shebang 就是放在 .py 文件头的 #! /usr/bin/env python3.10
这一行,用来指定解释器的路径以及版本。
Linux
起初是没打算在电脑上装新版本 Python 的,所以借用的在线 Python 环境——谷歌的 Colaboratory(以下简称Colab) ,Colab提供的是 Ubuntu 环境。
Linux 下 Shebang 的执行并没有什么大问题。需要注意的有两件事,一个是行结尾的格式(实际上是 Colab 的问题);一个是执行文件时命令选择 ./<filiname>
而不是 python <filename>
。
以下为 Colab 上的操作流程:
首先安装 Pyhton3.10 和 dos2unix 。Colab 中保存的文件行结尾是
\r\n
格式,需要用 dos2unix 转换成 Unix 格式下的\n
。
!
是在Colab 中运行 bash 命令的前缀,和 Shebang 中的!
本质相同。
!apt install python3.10
!apt install dos2unix
建立一个名为 test.py 的文件,内容如下:
#! /usr/bin/env python3.10
#-*- coding: UTF-8 -*-
import sys
print(sys.version)
先用 dos2unix 转换文本格式。
执行文件时使用./test.py
指令,不要使用python test.py
。后者会先选择默认解释器,再打开文件,Shebang 行就无法发挥作用。
!dos2unix test.py
!./test.py
输出如下:
3.10.1 (main, Dec 21 2021, 18:59:49) [GCC 7.5.0]
Windows
2.1. 命令行运行
在 Windows 的 Shell 中可以直接输入 py <filename>
,Windows 下的 py
命令会先打开一个启动器,这个启动器在读到 #!usr/bin/env python
等格式的 Shebang 行时,并不会把 usr/bin/env
当作一个严格路径。
Pyhton 启动器 py.exe
将 #! /usr/bin/env python3.10
,#!py -3.10
,#!python3.10
等指令都视为可执行的虚拟命令,并由启动器管理打开的解释器版本。Python官方文档:Shebang Lines
注:在 Windows 的 shell 中,仅Windows Store 安装的 Python 版本支持命令
python3.10
。安装包版本下pyhton
命令不支持指定 Python 版本,仅支持启动器命令py -3.10
。
2.2. 编辑器运行
Windows 下的编辑器我用的是 VS Code,VS Code 下的 Python、Code Runner 插件都提供了代码运行功能。
Code Runner
Code Runner 插件目前无法识别 Linux 格式 Shebang。
解决方法一是禁用掉 Shebang,在设置中将 "code-runner.respectShebang"
设为 false
。
解决方法二是使用 Windows 命令行格式 Shebang,#!py -3.10
。
Pyhon插件
首先将设置中的默认解释器路径从 python 改为 py ("python.defaultInterpreterPath": "py"
),和 Linux 相同,python
指令会先选择解释器再执行文件,py
指令在 Windows 环境下会先打开启动器读取 Shebang 行。
然后按键Ctrl/Command + Shift + P打开 VS Code 命令,输入python.setInterpreter
,选择 【Python:选择解释器】->【<当前工作区名称>】->【使用默认Pyhton解释器路径】(应显示为 py
)。
Python 插件同时支持 Linux 和 Windows 格式的 Shebang:#! /usr/bin/env python3.10
,#!py -3.10
。
注:本质上, VS Code 两个插件的区别在于:Code Runner 插件实际上是先将 Shebang 行交给了 shell 运行,因而仅支持 Windows 下 shell 可识别的命令;
而 Python 插件是先打开启动器py.exe
(通过设置),将 Shebang 行(以及整个文本)交给了启动器运行。