本节目标:搭好写代码和试代码的两个场所——编辑器与 REPL;读完后你能让编辑器用上虚拟环境的解释器,熟练使用
-c、-m、-i,并写出一个能直接运行、也能被导入的脚本。
适用版本:Python 3.12+(实测 3.14.6)
2.2 编辑器、REPL 与第一个脚本
上一节我们把解释器装好了。但解释器本身不会让你舒服地写代码——你需要一个编辑器来写文件,还需要一个能即时看到结果的地方来验证想法。这两件事对应本节的两个主角:编辑器与 REPL。
选一个顺手的编辑器
Python 不挑编辑器,任何能存成 UTF-8 纯文本的工具都能写 Python。但一个带 Python 支持的编辑器能帮你提前发现错误、跳转定义、自动补全,值得花十分钟配置。最主流的两条路线是 VS Code 与 PyCharm。
| 维度 | VS Code | PyCharm |
|---|---|---|
| 形态 | 通用编辑器 + 扩展 | 专门的 Python IDE |
| 安装 | 装编辑器,再装 ms-python.python 扩展 | 直接装 IDE |
| 资源占用 | 轻 | 重 |
| 类型检查 | 配合 Pylance | 内置,开箱即用 |
| 调试、重构 | 靠扩展,功能齐全 | 内置,深度集成 |
| 适合 | 多语言、轻量偏好 | 纯 Python、重度重构 |
VS Code。 在扩展市场搜索并安装官方的 Python 扩展(ms-python.python)。它提供语法高亮、代码补全、调试、运行按钮,并会提示你再装一个 Pylance 用于类型检查。
PyCharm。 分 Community(社区版,免费)与 Professional(专业版,付费)两个版本,日常开发社区版足够。它把解释器管理、调试器、重构工具全部内置,开箱即用。
选哪个都对,别纠结。真正重要的是下一步:把编辑器指向你上一节建好的虚拟环境。
把编辑器指向虚拟环境的解释器
编辑器必须知道「用哪个 Python」。如果它用了系统 Python 而不是你的 .venv,那么你在终端里 pip install 的包编辑器找不到,会出现「明明装了却提示未定义」的怪现象。
VS Code。 按 Cmd+Shift+P(Windows/Linux 为 Ctrl+Shift+P)打开命令面板,输入 Python: Select Interpreter,在列表里选中 ./.venv/bin/python。选中后 VS Code 会在项目根目录写入 .vscode/settings.json,记住这个选择。
PyCharm。 打开 Settings → Project → Python Interpreter,点齿轮图标选择 Add Interpreter → Existing,指向 .venv/bin/python。
配置完成后,编辑器的状态栏会显示当前解释器版本。这一步看似琐碎,却是新手最常踩的坑之一:只要解释器选对了,后面九成的「环境问题」都不会发生。
REPL:交互式解释器
直接在命令行敲 python(或 python3.14)不加任何参数,就进入 REPL——Read-Eval-Print Loop,读取、求值、打印、循环。它像一个随身的草稿纸,适合验证语法、试验某个函数的行为。
python3.14
Python 3.14.6 (main, Jun 10 2026, 10:03:53) [Clang 21.0.0 (clang-2100.0.123.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
看到 >>> 就说明你在 REPL 里了。随便敲点什么:
>>> 1 + 2
3
>>> "py" * 3
'pypypy'
>>> len([1, 2, 3])
3
REPL 会立刻显示每个表达式的值,连 print 都省了。这是 Python 学习速度远快于编译型语言的原因之一:你可以把想法拆成一行行验证。
3.13 起的改进。 老的 REPL 功能相当简陋,而 3.13 换上了一套全新的实现,主要改进有:
- 多行编辑:以前按回车就提交,无法回头改上一行;现在可以用方向键在整段输入里自由移动、编辑,写多行代码不再痛苦;
- 语法高亮:关键字、字符串、数字有颜色,
>>>提示符本身也带色,可读性大幅提升; - 直接输入
exit或quit退出:不再需要加括号写成exit(),当然exit()、quit()依旧可用; - 粘贴模式与历史浏览:按
F3切换粘贴模式(粘贴多行代码不会误执行),按F2打开历史浏览; - 彩色 traceback:报错信息按语法着色,一眼能看出出错的位置。
如果新 REPL 在你的终端里表现异常(少数老终端不支持),可以设环境变量 PYTHON_BASIC_REPL=1 退回旧版。
python -c 与 python -m
除了进入交互模式,命令行还有几种常用姿势。
-c:直接执行一段代码,适合一行就能说清的临时任务:
python3.14 -c "import sys; print(sys.version.split()[0])"
3.14.6
-m:把某个模块当作脚本运行。这是 Python 里极重要的一种调用方式——标准库自带许多可以直接用的工具。比如格式化 JSON:
echo '{"b":1,"a":[3,2]}' | python3.14 -m json.tool
{
"b": 1,
"a": [
3,
2
]
}
-m 会先把模块所在目录加入 sys.path,再执行模块。你后面会用到的 python -m venv、python -m pip、python -m pytest 全都是这个机制。-m 的好处是它运行的一定是「当前环境里」的那个模块,而不受 PATH 上恰好有个同名命令的干扰。
-i:执行完脚本后不退出,直接进入 REPL。这在调试时非常有用——脚本跑完,你还在它留下的现场里:
python3.14 -i -c "x = 21; print('脚本执行完毕')"
脚本执行完毕
>>> x * 2
42
>>>
脚本打印了 脚本执行完毕,然后停在 >>> 等你。此时变量 x 还在,可以直接查看和运算。
第一个脚本
REPL 适合试验,但真正的程序要写进文件。新建 hello.py,写入下面的内容:
"""第一个 Python 脚本:向标准输出打印一行问候。"""
import sys
def main() -> None:
name = sys.argv[1] if len(sys.argv) > 1 else "世界"
print(f"你好,{name}!")
print(f"当前解释器:{sys.version.split()[0]}")
print(f"运行方式:__name__ == {__name__!r}")
if __name__ == "__main__":
main()
运行它:
python3.14 hello.py
你好,世界!
当前解释器:3.14.6
运行方式:__name__ == '__main__'
再带一个参数运行:
python3.14 hello.py 开发者
你好,开发者!
当前解释器:3.14.6
运行方式:__name__ == '__main__'
短短十几行,已经带上了几个好习惯:
- 文件顶部写 docstring:用三引号写一句说明,
help(模块)时能看到它; import sys拿命令行参数:sys.argv是参数列表,sys.argv[0]是脚本名,从[1]起才是真正的参数;- 用 f-string 拼字符串:
f"你好,{name}!"里的{name}会被替换成变量值,这是最常用的格式化方式(第 3 章展开); - 把逻辑收进
main()函数:而不是散在模块顶层,便于测试和复用。
name == “main” 的作用
注意脚本最后那个 if __name__ == "__main__":。它看起来像句咒语,其实道理很简单。
每个模块都有一个 __name__ 属性。当文件被直接运行时,__name__ 的值是字符串 "__main__";当它被别的模块 import 时,__name__ 的值是模块名。用我们上面的脚本验证一下,先直接运行(上面已看到输出 '__main__'),再导入它:
python3.14 -c "import hello"
(没有任何输出)
导入时 __name__ 等于 "hello",所以 if 条件不成立,main() 不会执行,自然没有输出。这正是这行代码的价值:让同一个文件既能当脚本运行,又能被安全地导入而不产生副作用。如果你把 main() 直接写在模块顶层,那么任何人 import 这个文件时都会意外触发打印,非常糟糕。
这背后涉及模块、导入、命名空间一整套机制,第 5 章会完整展开。此处你只要记住这个惯用法的形态和目的即可。
命令行用法速查
把本节出现的几种调用方式汇总成一张表,方便日后查阅:
| 命令 | 作用 | 典型场景 |
|---|---|---|
python script.py | 运行脚本 | 日常执行程序 |
python | 进入 REPL | 试验语法、查函数行为 |
python -c "..." | 执行一段内联代码 | 一行搞定的临时任务 |
python -m module | 把模块当脚本运行 | -m venv、-m pip、-m json.tool |
python -i script.py | 跑完后进入 REPL | 调试、查看现场变量 |
python -V | 打印版本号 | 确认当前解释器 |
-c 与 -m 都常在自动化脚本里出现,比如 CI 里用 python -c "import platform; print(platform.machine())" 探测架构,或 python -m pip install -r requirements.txt 装依赖。
常见报错与排查
新手在这一步常撞上几个错误,提前认识能省下大量时间。
python: command not found。 说明系统里根本没有名为 python 的命令。这是 2.1 节讲过的历史包袱——在 macOS 与多数 Linux 上,正确的命令是 python3 或 python3.14。
ModuleNotFoundError: No module named 'xxx'。 代码里 import 了一个没装的库,或者装了但当前解释器看不到。先确认包确实装了(python -m pip show xxx),再确认编辑器和终端用的是同一个解释器。
SyntaxError: invalid syntax。 语法错误,报错行会带一个 ^ 指向出问题的位置。常见原因是漏了冒号、括号不配对,或者用了比当前版本更新的语法(比如在 3.11 上写 type X = int)。
IndentationError。 缩进错误。Python 用缩进表达代码块,混用空格和 Tab、或者该缩进的地方没缩进都会报这个错。约定是统一用四个空格。
REPL 里粘贴多行代码报错。 老 REPL 逐行执行,粘贴多行时中间的空行会提前提交。3.13 起按 F3 进入粘贴模式即可解决,或改用 python -m 运行文件。
排查这类问题有个通用顺序:先确认解释器路径对不对,再看报错类型,最后才怀疑代码逻辑。九成的「环境问题」都出在第一步。
小结
- 编辑器选 VS Code 或 PyCharm 都行,关键是把解释器指向虚拟环境的
.venv/bin/python,否则会出现「装了包却找不到」的怪问题。 - REPL 是随身草稿纸,3.13 起支持多行编辑、语法高亮,可直接输入
exit或quit退出。 python -c执行一段代码,python -m把模块当脚本运行(-m venv、-m pip都属此类),python -i在脚本执行后进入 REPL 便于调试。- 第一个脚本应养成好习惯:写 docstring、用 f-string、把逻辑收进
main()。 __name__ == "__main__"让文件既能被直接运行,又能被导入而不产生副作用;直接运行时__name__为"__main__",导入时为模块名。
你现在能写一个能跑的单文件脚本了。但真实项目不会只有一个文件——代码放哪儿、测试放哪儿、依赖怎么声明?下一节 2.3 项目结构与 pyproject.toml 初探
就来搭起一个标准项目的骨架。如果你对 import 时到底发生了什么还好奇,可以先看专题文章 Python 模块与包
。
阅读导航:上一节:2.1 安装 Python 与虚拟环境 · 下一节:2.3 项目结构与 pyproject.toml 初探 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。