🍓 第六章 开发 Python 程序
📄 一句话概括

上一节知道了 Python 是什么;本节解决"在哪儿写、怎么跑、跑错了怎么看"。 学完你会有三种开发方式(交互模式试算、编辑器写文件、命令行跑脚本),并想清一个本课特有的问题:这台机器是无头连着 SSH 的,那我到底在哪儿写代码?

📝 本节和前面几节的关系

本节把前面几件学过的东西串起来用:3-5 学的命令行(跑脚本)、3-3 学的"程序与软件包"(Thonny 是怎么装上的)、3-6 学的传文件(无头模式下把代码送到树莓派)。 上一节 6-1 是在命令行里"聊两句";本节开始,代码要落到文件里——这是从"玩"到"做"的分界线。 读法建议:三种方式都亲手试一遍(一共不到 5 分钟),别只看——手感是练出来的,不是看出来的。

一、先分清三种"写代码"的地方

新手最容易糊涂的地方:同样一句 print("你好"),为什么有的地方敲完立刻出结果,有的地方必须先保存?

因为它们是三个不同的地方:

方式 长什么样 什么时候用 能存下来吗
① 交互模式(REPL) 提示符是 >>>,敲一行答一行 试算、验证一个小想法 不能,关掉就没了
② 脚本文件 一个 hello.py 文件 正经程序都在这儿写 能,就是文件
③ 编辑器 / IDE 一个带菜单和按钮的窗口 写脚本文件(只是更好用的工具) 能
💡 一句话分清

①是草稿纸,②是作业本,③是更好的笔。 交互模式 不是"简化版",它是"不同用途"——就算你已经是老手,也天天用它验一句话的写法。

REPL 这个词:Read(读你一行)→ Eval(算)→ Print(打印结果)→ Loop(回去等下一行)。这四步循环,就是它名字的来历。

二、方式一:交互模式(最快的试验场)

上一节你已经进过了,这里补两个实用技巧。

进法:终端里敲 python3,提示符变成 >>>。退出:敲 exit() 或按 Ctrl + D。

技巧 1:它自带计算器

>>> 128 * 4
512
>>> 2 ** 10
1024
>>> 1.5 + 2.25
3.75

技巧 2:上一次的结果存在 _ 里

>>> 100 * 3
300
>>> _ + 50
350
📝 `_`(下划线)是什么

在交互模式里,下划线 _ 自动保存"上一次算出来的结果"。 这在一步步试算的时候很省事(比如先算出总数,再拿它除以天数)。但注意:这个特性只在交互模式里有,写进 .py 文件里是没用的。

交互模式的短板(所以它只能当草稿纸):

三、方式二:脚本文件(正经的写法)

3.1 先建一个放代码的目录

别把代码随手扔在家目录里。给它一个专门的窝(目录怎么建见 Linux 的常用指令):

mkdir -p ~/projects
cd ~/projects

~ 是你的家目录(/home/你的用户名),-p 表示"要建几层就建几层,已有也不报错"。

3.2 写文件

最朴素的办法:命令行编辑器 nano(3-5 学过,无头模式下最方便):

nano hello.py

进去后打这几行:

print("你好,树莓派!")
print("这是我写的第一个 Python 程序。")

保存退出:Ctrl + O → 回车(确认文件名)→ Ctrl + X。

⚠️ 文件名一定要带 `.py`

.py 不是给 Python 看的(Python 不看后缀也能跑),而是给编辑器、给你自己、给别人看的——它表示"这是个 Python 文件",编辑器才会给你语法高亮。 忘了写后缀,编辑器当它是普通文本,你会得到一片黑白。

3.3 跑它

python3 hello.py

输出:

你好,树莓派!
这是我写的第一个 Python 程序。

看到什么算成功:两行中文一字不差地打印出来,中间没有 SyntaxError。

3.4 让脚本能"直接跑"(进阶一点点,但很值)

现在每次跑都要写 python3。也可以让它像命令一样直接执行:

# ① 在文件第一行加一句"我是谁"
nano hello.py

在第一行(必须是第一行)加上:

#!/usr/bin/env python3
print("你好,树莓派!")
# ② 给它"可执行"权限(权限怎么算见 4-3)
chmod +x hello.py

# ③ 直接跑
./hello.py
📝 第一行那句 `#!` 是什么

它叫 shebang(读作"西-邦")。它的作用是告诉 Linux:"这个文件请用哪个程序来执行"。 #!/usr/bin/env python3 的意思是"帮我找环境里那个 python3,用它来跑"。 用 env 而不是写死 /usr/bin/python3,是因为不同系统上 python3 的位置可能不一样——env 会自己去找。这是个老练的写法。

四、方式三:用编辑器 / IDE 写(推荐 Thonny)

命令行写代码能跑,但没有语法高亮、没有补全、没有一键运行。所以在这个桌面上,官方给你准备了一个专门的工具。

4.1 Thonny:树莓派官方预装的 Python 编辑器

好消息:不用装。 Raspberry Pi OS 的桌面版和完整版都自带 Thonny(只有 Lite 版没有——因为它压根没桌面)。

打开方式:点左上角的树莓派菜单 → 编程(Programming) → Thonny。

界面就三块,很好认:

区域 位置 干什么
代码区 上面一大块 写代码的地方(一个文件一个标签页)
Shell 下面一块 显示运行结果、也能当交互模式用(对,它内置了一个 >>>)
变量区 右侧(可能默认收起) 看每个变量的当前值——这是 Thonny 对新手的最大帮助

基本操作四步:

  1. 写:在代码区打字(自带语法高亮和自动缩进对齐)
  2. 存:Ctrl + S(或 文件 → 保存),存成 hello.py
  3. 跑:F5(或那个绿色播放按钮)
  4. 看:结果显示在下面的 Shell 里
💡 Thonny 为什么特别适合入门

① 它自带 Python 解释器——不用你去配"用哪个 Python",开箱就用系统这个。 ② 它有单步调试:点"步进"按钮可以一行一行执行,同时右边变量区实时显示每个变量变成了什么。 这两个特性加起来,就是"让程序的内部过程看得见"——这是初学者最缺的东西。

4.2 其他编辑器(知道有这回事就行)

工具 特点 装法
Geany 轻量、支持多语言(C、C++、Java 也能写) 桌面/完整版预装,或 sudo apt install geany
Mu Editor 另一个面向初学者的 Python 编辑器 sudo apt install mu-editor
nano / vim 命令行编辑器,无头模式的唯一选择 系统自带
VS Code 功能最强,但吃内存(建议 4GB 以上机型) sudo apt install code

怎么选:本课就用 Thonny——它是为"学 Python"专门设计的,别人没有它那两个教学特性。

4.3 ⚠️ 本课特有情况:无头模式下在哪儿写

本课的环境约定是树莓派真机 + Windows + SSH 无头连接(见 2-3 与 3-6)。没有接显示器,Thonny 就没法在树莓派上开——它是个图形程序。

那你怎么办?两条路,都行:

路线 A:就在树莓派上用命令行写(最省事,也是最适合本课的)

nano ~/projects/hello.py     # 写
python3 ~/projects/hello.py  # 跑

nano 只学三个键就够用:Ctrl + O 保存、Ctrl + X 退出、Ctrl + W 搜索。

路线 B:在 Windows 上写,传过去跑(代码长的时候更舒服)

# 在 Windows 的 PowerShell / cmd 里执行
scp hello.py 用户名@树莓派IP:~/projects/
⚠️ 路线 B 有一个必踩的坑

Windows 和 Linux 的"换行符"不一样,Windows 写出来的文件可能带着 \r(回车),Linux 有时会因此报奇怪的错。 判断办法:如果报错里出现 '\r' 或提示 bad interpreter,就是这个原因。 两个解法:① 在 Windows 编辑器里把换行符设成 LF(Notepad++ 右下角能改);② 传过去后在树莓派上转一遍:

sed -i 's/\r$//' hello.py
💡 还有路线 C(知道就好)

Thonny 也能当"远程编辑器":在 Windows 电脑上装一个 Thonny,把解释器设成树莓派上的(运行 → 选择解释器 → Remote Python 3 (SSH)),就能在 Windows 的图形界面里写、直接在树莓派上跑。 这是最舒服的方案,但配置稍多(要填 IP 和用户名),本课先用手感最简单的路线 A,等你觉得 nano 不够用了再回来试它。

五、代码写长了怎么办:两个保命习惯

习惯一:写之前先用 --version 之外的另一种方式检查语法

Python 是解释型,语法错误要跑到那一行才发现。所以有一个提前体检的命令:

python3 -m py_compile hello.py

没输出 = 语法没问题;有输出就是语法错误。长脚本改完先跑一遍这个,比直接运行更快找到"手滑"。

习惯二:别一次写 100 行

Python 一行报错的定位很准(会告诉你第几行),但前提是你只改了几行。 一次写太多,报错时你根本不知道是哪一次改动引入的。写完 5~10 行就跑一次——这叫"小步前进",是本课程后面所有硬件实验的默认打法。

六、动手 Demo:走完三种方式

第 1 步 · 交互模式试算

python3
>>> 7 * 6
42
>>> 2 ** 8
256
>>> exit()

第 2 步 · 写一个文件

mkdir -p ~/projects
cd ~/projects
nano hello.py

内容:

print("你好,树莓派!")
print("这是我写的第一个 Python 程序。")

Ctrl + O 回车,Ctrl + X 退出。

第 3 步 · 跑它,并让它在最后打印一行"谁在跑我"

python3 hello.py

再试一次,这次直接看 Python 路径:

python3 -c "import sys; print(sys.executable)"

第 4 步 · 故意写错,看报错长什么样(这一步最重要)

nano broken.py

里面故意把第二行的 print 打成 pritn:

print("第一行是好的")
pritn("第二行函数名打错了")

跑:

python3 broken.py

你会看到:

第一行是好的
Traceback (most recent call last):
  File "/home/你的用户名/projects/broken.py", line 2, in <module>
    pritn("第二行函数名打错了")
    ^^^^^
NameError: name 'pritn' is not defined. Did you mean: 'print'?

这里有三个信息量很大的点:

  1. 第一行打印出来了,第二行才报错——这就是"解释型"最直白的证据:它一行行往下跑,跑到坏的那行才发现问题(编译型的 C++ 会在编译阶段就把所有错挑出来,一行都跑不了)。
  2. line 2 和 ^^^^^ 直接指出错在哪。
  3. 最后那句 Did you mean: 'print'? 是 Python 3.10 之后加的智能提示——它连你打错的字都猜出来了。

第 5 步 · 用 Thonny 走一遍(有桌面的话)

菜单 → 编程 → Thonny → 打开 hello.py → F5。

看到什么算成功:

步骤 成功的样子
交互模式 7 * 6 打印 42
python3 hello.py 打印两行中文,无任何报错
第 4 步故意写错 先打印出第一行,然后报 NameError,指出 line 2,并提示 Did you mean: 'print'?
Thonny 里 F5 Shell 区显示同样两行

读结果:第 4 步里,"第一行成功、第二行才炸"这件事本身就是知识点——它证明 Python 是一行行边跑边翻译的(如果换成 C++,整个程序连第一行都不会输出)。而 line 2 和那个 ^^^^^ 箭头是最有价值的信息:Python 直接告诉你"我读到哪儿发现不对"。

七、30 秒实验

实验一:文件的后缀不影响运行

cp hello.py hello.txt
python3 hello.txt

照样跑出结果。 因为 Python 不看后缀,它是"把文件内容当代码读"。(那为什么还要写 .py?为了编辑器能高亮、为了别人一看就懂——这是"给人看"的约定,不是"给机器看"的。)

实验二:感受 shebang 的作用

nano whoami.py

写入:

#!/usr/bin/env python3
print("我是被谁跑的?")
chmod +x whoami.py
./whoami.py          # 能跑,打印出那句中文

现在把第一行 shebang 删掉(只留 print 那行),再跑一次:

nano whoami.py       # 删掉第一行,Ctrl+O 保存、Ctrl+X 退出
./whoami.py          # 这次跑不起来了

结果是报错(大意是 Syntax error: ... "print",因为系统不知道该用 Python 来执行它,就用默认的 shell 去读,shell 看不懂 print(...) 这种写法)。

💡 结论

./文件名 这种跑法,靠的就是第一行的 shebang 告诉系统"用谁来执行我"。 把 shebang 删了,chmod +x 给的执行权限就"无处可施"了。而用 python3 文件名 这种跑法根本不需要 shebang——因为你已经把解释器指定给它了。

实验三:一句话验语法

python3 -m py_compile hello.py && echo "语法没问题 ✅"

没报错就会打印出 语法没问题 ✅。

八、常见误区

  1. "交互模式也能写正经程序" —— 不能。它不能保存、一次只能一行。它是草稿纸,正经程序一律落到 .py 文件。
  2. "文件必须叫 .py,不然跑不了" —— 反了。后缀不影响能不能跑(Python 只看内容),它影响的是"别人和编辑器怎么认这个文件"。还是老实写 .py。
  3. "写代码必须用 IDE,命令行写不了" —— 命令行不仅能写,在无头模式下它是唯一的写法。nano 三个键(保存/退出/搜索)就能撑起你这门课的大部分代码。
  4. "报错就是我的代码全废了" —— 正相反。Python 的报错是"从下往上读"的线索:最后一行说【什么错】,line N 说【在哪一行】。看得懂报错,你就能自己修——这是本章最有价值的一项技能。
  5. "Windows 上写的 .py,直接传过去就能跑" —— 大多数时候能,但换行符不一样(Windows 是 \r\n、Linux 是 \n),偶尔会报奇怪的错。解法:编辑器设成 LF,或传过去用 sed -i 's/\r$//' 转一遍。
  6. "Thonny 是给小孩用的,正经开发不能用" —— 它轻、内置解释器、有单步调试,在树莓派这种资源有限的机器上非常合适。VS Code 功能更强但吃内存(2GB 机型跑起来很吃力)——工具要配机器,不是越强越好。
自测三问(点开对答案) 1. 交互模式(REPL)和脚本文件,分别适合什么场景? 2. 无头模式下你没法开 Thonny,那在哪儿写代码?两种办法各是什么? 3. Python 报错信息该从哪一行开始读? **参考答案** 1. **交互模式是草稿纸**——试算、验证一句写法的对错,用一次就扔(**不保存**);**脚本文件是作业本**——正经程序都写在这儿,能保存、能传给别人、能反复运行。 2. **路线 A:就在树莓派上用 `nano` 写**(`nano 文件.py`,`Ctrl`+`O` 保存、`Ctrl`+`X` 退出),再用 `python3 文件.py` 跑;**路线 B:在 Windows 上写好,用 SFTP 或 `scp` 传过去跑**(注意换行符要设成 LF)。 3. **从最后一行往上读**。最后一行是【什么错】(如 `SyntaxError`、`ZeroDivisionError`),往上一行给出 `line N`(在哪一行)和箭头(指到出错位置)。

相关笔记