2. 使用 Python 解释器
对应官方文档:2. Using the Python Interpreter 一句话导读:这一章解决「怎么把 Python 跑起来」——命令怎么敲、参数怎么传、交互模式怎么用、中文为什么不会乱码。
上一章是画饼,这一章官方自己都说了是「有点枯燥但必不可少」的机械知识:不搞定它,后面所有例子你都敲不动。村长按官方的 2.1、2.1.1、2.1.2、2.2、2.2.1 顺序讲,最后补一张三大系统的差异表。
2.1 调用解释器
Python 解释器本质上就是一个「读你写的东西、然后照着做」的程序。官方说它的行为有点像 Unix shell:
- 如果标准输入连着终端(你直接敲
python3回车),它就一行一行读、一行一行执行,这叫交互模式。 - 如果给了文件名参数,或者把文件通过管道喂进来,它就把整个文件当脚本从头执行到尾。
在 macOS / Linux 上,解释器通常装在 /usr/local/bin/python3.x 之类的位置,把这个目录加进 PATH 后就能直接敲命令:
python3
python3 --version
python3 hello.py
python3 -c "print(1 + 1)"
python3 -m http.server 8000
这里有几个高频开关,村长给你捋一遍:
| 写法 | 作用 |
|---|---|
python3 script.py | 执行一个脚本文件 |
python3 -c "命令" | 直接执行引号里的一段语句,记得整体加引号 |
python3 -m 模块 | 把一个模块当脚本跑,比如起个静态服务器 |
python3 -i script.py | 先跑完脚本,再留在交互模式里,方便接着查变量 |
-c 和 -m 后面的参数不会被解释器自己吞掉,而是留给你的命令或模块处理——这一点在 2.1.1 还会再遇到。
关于 python 还是 python3
官方有个脚注专门解释:在 Unix 上,Python 3 默认不安装成叫 python 的可执行文件,免得和同时装着的 Python 2 打架。所以 macOS / Linux 上请老老实实用 python3,敲 python 有可能指向 Python 2,也有可能直接报「找不到命令」。
Windows 不一样:从 Microsoft Store 装的话会有 python3 命令;装了官方安装器则有 py 启动器,py -3 可以指定版本,py 后面直接跟脚本名也行。
村长划重点:教程里统一写
python3。macOS / Linux 用户如果敲python版本不对,十有八九是踩了 Python 2 的坑;Windows 用户认准py启动器最省心。
三大系统差异速查
| 系统 | 常用启动命令 | 退出交互模式 | 备注 |
|---|---|---|---|
| macOS | python3 | exit() 或 Ctrl-D | 系统可能自带旧版,建议另装新版 |
| Linux | python3 | exit() 或 Ctrl-D | 发行版包管理器里叫 python3 |
| Windows | py、python、python3 | exit() 或 Ctrl-Z 再回车 | Store 版给 python3,安装器给 py |
退出交互模式有三种写法:输入文件结束符(Unix 是 Ctrl-D,Windows 是 Ctrl-Z 加回车),或者敲 exit(),或者敲 quit()。注意 exit() / quit() 是 site 模块给交互模式加的便利函数,在正式脚本里默认没有,别写进 .py 文件。
2.1.1 参数传递
脚本名和后面跟的参数,会被解释器打包成一个字符串列表,放进 sys 模块的 sys.argv 里。想读它,先 import sys。
import sys
print("参数个数:", len(sys.argv))
print("脚本名:", sys.argv[0])
for i, arg in enumerate(sys.argv[1:], start=1):
print(f"第 {i} 个参数:{arg}")
把上面存成 demo.py,再执行 python3 demo.py hello 42,会看到:
参数个数: 3
脚本名: demo.py
第 1 个参数: hello
第 2 个参数: 42
几个容易记混的细节,官方都写明了:
sys.argv至少有一个元素。什么参数都不给时,sys.argv[0]是空字符串。- 脚本名写成
-(表示从标准输入读)时,sys.argv[0]就是-。 - 用
-c时sys.argv[0]是-c;用-m时是模块的完整名字。 - 注意所有参数都是字符串,
"42"不是数字 42,要算数得自己int()转一下。
村长划重点:
sys.argv[0]是脚本自己的名字,不是「第一个参数」。真正从命令行传进来的第一个值在sys.argv[1],新手在这里越界报IndexError的特别多。
2.1.2 交互模式
当命令是从终端读进来时,解释器就处于交互模式。它用主提示符 >>> 等你下一条命令;碰上 if、for、函数定义这种要写好几行的结构,就换成次提示符 ... 让你继续补。第一次出提示符前,还会先打印版本号和版权信息。
$ python3
Python 3.13.0 (default, ...) on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + 1
2
>>> the_world_is_flat = True
>>> if the_world_is_flat:
... print("小心别掉下去!")
...
小心别掉下去!
>>> exit()
注意那个空行:在交互模式里输入复合语句,必须再敲一个空行告诉解析器「我写完了」,否则它会一直用 ... 等你。这跟写 .py 文件不一样,文件到结尾自然就结束了。
交互模式还有行编辑、历史记录、代码补完(大多数系统都有)。官方给了一个土办法检测:随便敲几个字母再按左方向键,光标能动就说明支持;如果冒出 ^[[D 这种乱码,那就只能用退格键了。
村长的建议:练语法、试函数、当计算器,用交互模式最爽;但凡超过五六行、要反复改的,老老实实存成 .py 文件,别在提示符里跟自己较劲。
2.2 解释器及其环境
这一节官方讲的是「解释器怎么看待它周围的环境」,重点是源码文件的编码。另外提一句:标准库虽然允许用各种字符当标识符,但标准库自己只用 ASCII 命名,写要给别人用的代码也建议守这个约定,省得换台机器就出幺蛾子。
还有个隐藏前提:你的编辑器得认得出文件是 UTF-8,并且字体能显示这些字,否则代码没乱码、屏幕上先花了。
2.2.1 源码编码
默认情况下,Python 源文件按 UTF-8 读取。UTF-8 能同时装下世界上大多数语言的字符,所以字符串、注释、甚至变量名里写中文都没问题。
课程 = "Python 教程"
print(课程)
print("长度:", len(课程))
Python 教程
长度: 9
如果确实要用别的编码(比如编辑器死活只肯存 Windows-1252),就得在文件第一行加一条特殊注释声明:
# -*- coding: cp1252 -*-
其中 cp1252 换成 Python 支持的任意编码名即可。装饰用的 -*- 其实是给 Emacs 一类编辑器看的,Python 真正认的是 coding: 或 coding= 这个片段,所以简写成 # coding: cp1252 也有效。
「第一行」规则有一个例外:文件若以 Unix 的 shebang 行开头,编码声明要挪到第二行:
#!/usr/bin/env python3
# -*- coding: cp1252 -*-
你可以这样理解:第一行要留给「用哪个程序执行这个文件」,编码声明只好往后坐一位。shell 靠 shebang 找解释器,Python 靠编码声明读字节,两件事各占一行,谁也不挤谁。
村长划重点:现在 Python 3 默认就是 UTF-8,绝大多数情况下不需要再写
# -*- coding: utf-8 -*-。网上老教程里那一行是 Python 2 时代的遗留习惯,照抄没坏处,但别以为不写就会乱码。
村长划重点:真乱码时先怀疑「编辑器保存成了别的编码」,而不是先怀疑 Python。把编辑器统一设成 UTF-8,能省掉九成的编码问题。
本章小结
- macOS / Linux 用
python3,Windows 可用py/python/python3;先拿--version确认版本。 - 解释器像 shell:连终端就交互执行,给文件名就跑脚本;
-c执行一段语句,-m跑模块,-i跑完留在交互模式。 - 命令行参数变成
sys.argv字符串列表,argv[0]是脚本名,参数从argv[1]开始,且都是字符串。 - 交互模式主提示符
>>>、次提示符...,复合语句要空一行才结束;exit()、quit()或Ctrl-D/Ctrl-Z退出。 - 源码默认 UTF-8;换编码要在第一行(有 shebang 则第二行)写
# -*- coding: -*-声明。