1. 为什么要从 Python 和 Linux 开始
1.1 这套组合到底意味着什么
看到"26期_01_Python Linux"这个标题,我第一反应是:这又是一个面向零基础开发者的入门系列课程,而且是整个系列的第一讲。Python 和 Linux 放在一起讲,不是因为培训机构喜欢把两个热门词拼在一起,而是这两样东西在真实开发场景里根本拆不开。
我自己这些年接触过不少刚入行的同学,很多人一开始只装了 Windows,装个 Python 也能跑,但一旦需要部署项目、处理定时任务、操作服务器日志、跑数据脚本,就绕不开 Linux。业界常说"写代码在 Windows,跑代码在 Linux",这是非常实际的体验。所谓一期课程的"01",通常意味着从零开始讲:不假设你懂命令行,不假设你配置过环境,甚至不假设你了解什么是操作系统层面的"文件权限"。
所以这篇内容适合谁?适合刚接触编程、想把 Python 作为第一门语言,同时想搞懂它和 Linux 如何协作的同学。也适合那些已经会写一点 Python 但从来没在 Linux 下部署过东西的初级开发者。你可以把它当作整个入坑路线的第一站。
1.2 刚开始最需要解决的三个问题
我在带新手的过程中发现,Python 和 Linux 入门阶段,最难的不是语法,而是几个非常基础却绕不开的问题。
第一个是环境问题。Python 有 2 和 3 的区别,有不同版本,有系统自带的 Python 和手动安装的 Python,如果没搞清楚这些共存关系,后面安装包、跑脚本会出现大量看起来莫名其妙的问题。第二个是工具链问题。很多人知道用 pip,但不知道为什么同一个项目在这台机器能跑、换台机器就挂,更不知道虚拟环境存在的意义。第三个是"感觉问题"。Linux 的命令行一打开就是黑底白字,没有任何图形界面提示,新手第一反应是"我该干什么"。这需要一个循序渐进的场景来引导,而不是直接丢一本命令大全。
这篇文章的思路就是围绕这三个问题展开:先把 Linux 环境跑起来,再把 Python 环境理清楚,最后让两者在真实的小任务里配合起来。读完你会有一种"原来如此"的感觉,而不是"背了一堆命令"。
2. 内容整体设计与思路拆解
2.1 为什么把 Linux 摆在 Python 前面
很多零基础的课程会先讲 Python 语法,再补 Linux,但这里的设计顺序反过来了:先让大家在 Linux 里待着,边操作熟悉命令,边引入 Python。这个安排是有道理的。
先学一点点 Linux 基础,比如 cd、ls、mkdir、vim 这几个命令,后面在写 Python 的时候会非常自然地把文件路径、目录结构、执行权限这些东西串联起来。反过来,如果你先用 Windows 写 Python 写了一个月,突然切换到 Linux,光是文件路径的风格差异和命令行的操作习惯就够你适应好一阵子,学习曲线反而更陡。
我自己试过一次快速切换教学方案:让零基础学员先花三天熟悉 Linux 终端,每天都用命令行创建文件、移动文件、编辑脚本,然后再开始写 Python。结果这些人后面遇到路径拼接、跨平台部署问题的时候,理解速度明显快过那些从 Windows 直接起步的人。因为 Linux 命令行天生就逼着你理解"文件在哪里""哪个程序在跑"这些底层概念,写代码时思路会更踏实。
2.2 方案选型:哪种 Linux 更合适
对于刚接触 Linux 的同学,选发行版确实是个容易纠结的事情。我的建议非常直接:如果你是为了跟课程、打基础,用 Ubuntu 或者 Debian 系就好,原因是生态成熟、资料多、包管理器简单。日常中无论是安装 Python 相关的系统依赖库,还是安装 Nginx、Redis 这类服务,apt 一条命令基本都能搞定,出问题的时候网上也有大量现成答案。
很多初学者会问:为什么不直接上 CentOS 或者更小众的发行版?不是不能,但没必要。入门阶段不要给自己增加额外的环境差异成本。实际工作生产环境用什么发行版,那是公司架构师考虑的事情,你自己学习阶段先把"用 Linux 干活"这个手感练出来更重要。
我的建议是:在虚拟机里装一个 Ubuntu Server 版本,没有桌面环境,逼迫自己在纯命令行下完成操作。很多人怕命令行,但 Python 开发也好、后续的脚本部署也好,日常操作都是在纯命令行下完成的,早适应早受益。
2.3 环境隔离意识要从第一天建立
再来说说虚拟环境。这是整个入门过程中我认为最应该被提前灌输、却总被忽略的点。很多初学者装好 Python 后,不管三七二十一,pip install 直接装全局。这个习惯一开始看起来没问题,但一旦你同时维护两三个小项目,就会出现版本冲突:A 项目用 2.x 版本的库,B 项目需要 3.x 版本,你在系统环境里装一个新版本,可能就把 A 项目弄挂了。
虚拟环境解决的就是"同一个 Python 解释器,但每个项目用独立的包空间"这个问题。第一天就建立这个习惯并不难,后面会减少大量不必要的麻烦。我见过不少同学因为环境混乱把半天时间花在排查"为什么那个项目跑不了了"上,最后发现只是装了一个别的项目的依赖,这种冤枉时间完全可以通过从一开始就建虚拟环境来避免。
3. 核心细节解析与实操要点
3.1 虚拟机还是 WSL
动手之前得先解决"我的 Linux 在哪儿跑"的问题。目前对于 Windows 用户来说,方案大致有三种:安装虚拟机软件再装 Linux、使用 Windows 自带的 WSL、或者直接找一台闲置电脑装双系统。
WSL 是目前我比较推荐的入门方式,因为它不像虚拟机那样需要预分配内存和磁盘、启动速度也快,你可以直接在 Windows 桌面环境里面打开一个 Linux 终端,和本地文件系统之间的交互也方便。但 WSL 也有一个短板:如果你后面要学 Linux 系统管理、内核相关的东西,WSL 毕竟还是偏"用户层"的模拟,和真正的 Linux 服务器会有一些细微差异。
虚拟机方案(比如常见的 VirtualBox 配合 Ubuntu)更接近一台真实的 Linux 机器,网络、存储、权限这些逻辑和服务器更一致。缺点是资源占用大、启动慢,对电脑配置有一定要求。如果你的电脑内存小于 8GB,跑虚拟机会有点吃力,那就优先考虑 WSL。我自己做教学的时候一般建议电脑配置够的同学直接用虚拟机,配置紧张的同学先用 WSL,两条路都不影响后续学习。
3.2 装好之后首先该做什么
假设你已经装好了一个 Ubuntu 环境,登录进去拿到一个命令行终端。按照我自己的习惯,新环境到手做三件事:
第一,更新系统软件源和已有软件包。Ubuntu 初始状态下,用sudo apt update和sudo apt upgrade把系统包更新到最新,这一步能避免后续装软件时遇到依赖版本过旧的问题。
第二,安装基础工具包。比如build-essential、curl、git、vim。这些工具不一定马上全用上,但在后面编译 Python 扩展、拉代码、改配置文件的时候一定会需要。提前装好省得半路卡壳。
第三,确认自带 Python 状态。Ubuntu 22.04 和 24.04 系统默认带了 Python 3.10 或 3.12,你可以直接执行python3 --version查看。这里注意一点:系统自带的 Python 尽量不要删除或替换,因为系统的很多管理工具依赖它。后面我们会用别的方式管理 Python 版本。
3.3 文件结构与命令的记忆方法
Linux 的学习里最容易让人挫败的就是"命令太多记不住"。这里我的观点是:不要背,要用。你只需要先掌握一条主线,剩下的随用随查就行。
主线命令大概就是:pwd看当前目录、ls查看目录内容、cd切换目录、mkdir创建目录、touch创建空文件、cat查看文件内容、rm删除文件、cp复制文件、mv移动或重命名文件。这些命令涉及了文件和目录的整个生命周期,日常 80% 的操作都被覆盖了。至于权限管理、进程管理、网络查询那些,等用到了再针对性地学,效果反而好。
记忆方法和小时候记单词类似:每次操作的时候,想想这个命令是哪个英文单词的缩写。比如ls是 list(列出)、pwd是 print working directory(打印当前工作目录)、mkdir是 make directory(建目录)。理解了词源,你会发现命令的本质就是"告诉系统对你指定的东西做某个操作"。
3.4 权限概念为什么重要
很多新手在 Linux 下执行脚本的时候会碰到一个报错:Permission denied,中文意思就是"没权限"。这个报错背后的原因是 Linux 的权限模型和 Windows 差别很大。
Linux 系统里,每个文件都有"属主"和"属组"的概念,并且对文件的操作权限分为读、写、执行三种,分别用 r、w、x 表示。当你试图运行一个没有执行权限的 Python 脚本时,系统就会明确拒绝你。这在 Windows 下是没有的体验,因为 Windows 默认对文件可执行性的判断更多看扩展名。
我见过很多新手在这个地方栽跟头:明明代码是对的,但运行报错,然后花大量时间去检查代码,实际上只是忘记给脚本加执行权限。避免这个问题很简单,要么用python3 script.py的方式直接调用脚本(此时不依赖脚本的可执行权限),要么用chmod +x script.py赋予执行权限。理解权限模型的本质,是 Linux 入门阶段必须跨过的一道坎。
4. 实操过程与核心环节实现
4.1 第一步:建立项目目录
我们用一个具体的小任务来演示:创建第一个 Python 项目,并且在其中跑通一段脚本。
打开终端,在 home 目录下建立一个名为first_project的项目文件夹:
cd ~ mkdir first_project cd first_project这里~代表当前用户的家目录,对新手来说记住这个符号很有用,因为它是一个绝对路径的快捷方式。在 Linux 下,目录决定一切,你的项目在哪里、脚本在哪里、日志在哪里,都要有清晰的规划。先建一个专用目录,避免把所有零散文件堆在根目录或用户目录下,这是良好习惯的开始。
4.2 第二步:搭建 Python 虚拟环境
创建好项目目录后,在里面建立虚拟环境。我这里假设系统已经安装了 python3-venv 这个组件,如果没有,先执行:
sudo apt install python3-venv然后创建虚拟环境并激活它:
python3 -m venv venv source venv/bin/activate激活之后,命令行前面通常会出现一个(venv)的提示符,代表你当前正处在虚拟环境中。在这个状态下安装的所有 Python 包都会进到这个项目独立的目录里,不会污染全局环境。这一步非常重要,也是整个入门过程里最应该形成肌肉记忆的环节之一。
如果哪一天你忘记了为什么创建虚拟环境,可以回想这个例子:项目 A 需要requests2.25 版本,项目 B 需要requests2.31 版本,如果不用独立环境,两个需求是没法共存在一个全局环境里的。用虚拟环境,各装各的,互不影响。
4.3 第三步:编写第一个真正的脚本
虚拟环境就绪之后,我们写一个不是 hello world 的小脚本,但也不复杂。我倾向于写一个带点实际处理逻辑的小程序,比如批量重命名某个目录下的文件。这个任务用到 Linux 的目录操作和 Python 的文件处理能力,正好把前面知识都串起来。
先用touch创建几个文本文件模拟场景:
touch report_2024_old.txt touch report_2023_old.txt touch report_2022_old.txt现在目标是把这些文件名字里的_old去掉,改成report_2024.txt这种格式。用 Python 实现方式如下:
# rename_files.py from pathlib import Path target_dir = Path(".") for old_file in target_dir.glob("*.txt"): if "_old" in old_file.name: new_name = old_file.name.replace("_old", "") old_file.rename(new_name) print(f"重命名: {old_file.name} -> {new_name}")保存文件后运行:
python3 rename_files.py这个脚本的核心是pathlib这个标准库,它提供了一种面向对象的方式来操作文件和目录,和 Linux 的文件系统概念天然契合。新手容易在这里犯的一个错误是:直接用字符串拼路径,但跨平台时路径分隔符不一样,用pathlib可以很好地规避这类问题。
4.4 第四步:用 Shell 思维配合 Python
再扩展一步:我们在终端里用一条命令看看结果:
ls -la你会看到文件确实被重命名了。这时可以引出一个很有意思的思维:Linux 的命令和 Python 脚本常常是配合使用的。比如你想对项目里所有 Python 文件做一个简单的代码统计,可以直接用 Shell 命令:
wc -l *.py但不做复杂统计的话,用 Python 处理更灵活。比如统计哪个文件行数最多,可以写几行脚本:
from pathlib import Path lines_count = {} for py_file in Path(".").glob("*.py"): lines_count[py_file.name] = len(py_file.read_text().splitlines()) print(max(lines_count, key=lines_count.get))这就是"用 Python 增强 Shell,用 Shell 增强 Python 的日常使用"的典型场景。整个开发过程不应该是"必须全用命令行"或者"必须全写脚本",而是两者结合,哪个方便用哪个。
4.5 第五步:安装第三方库
一个只依赖标准库的 Python 项目毕竟有限。我们再演示一下第三方库的安装。
虚拟环境中安装通常直接使用 pip:
pip install requests然后写一个简单的网络请求脚本测试它:
import requests resp = requests.get("https://httpbin.org/get") print(resp.status_code) print(resp.text[:200])这里要注意,HTTP 请求涉及外网,如果网络环境受限,可能超时,选一个你本地网络能访问的接口即可。这个例子只是为了展示"安装库—导入库—使用库"的完整链路。另外提醒一下,如果你看到pip不是最新版本的提示,可以先用pip install --upgrade pip更新一下。但是注意:不要随意升级系统级 pip,最好在虚拟环境内操作。
4.6 第六步:把脚本变成可执行文件
最后,我们把写好的脚本变成一个可以从命令行直接执行的文件,而不是每次都用python3 script.py调用。
在脚本第一行加上 shebang 标记:
#!/usr/bin/env python3然后赋予执行权限:
chmod +x rename_files.py现在你可以直接执行:
./rename_files.py这个做法在部署脚本到服务器时特别常用,也是 Linux 下管理小工具的标准姿势。你可能会看到很多开源项目的命令工具都是这样设计入口的。理解了这个原理,后面看别人项目的启动脚本就不会发怵。
5. 常见问题与排查技巧实录
5.1 命令找不到:command not found
这是最常见的一类问题。大概率原因是你输入的命令名不对,或者这个软件还没安装。比如你输入python,Ubuntu 上默认系统只装了python3,这时候就会提示 command not found。
解决办法是先确认自己到底装了哪个版本:ls /usr/bin/python*可以看系统中有哪些 Python 相关程序。如果没有安装,可以用sudo apt install python3来装。这类问题不需要死记,关键是理解"命令来自于系统中的可执行程序文件"这个底层逻辑:你敲下的每一个命令,都是在系统路径的某个目录里寻找对应的可执行文件。
5.2 虚拟环境激活后 pip 仍是全局的
有时候你明明激活了虚拟环境,但是敲pip时发现并不是虚拟环境内的版本。通常是因为你曾经在~/.bashrc或者某个配置里设置了别名,或者激活的环境变量没有被正确优先级处理。
排查方法很简单:执行which pip,看输出路径。如果路径指向/usr/bin/pip而不是虚拟环境目录下的venv/bin/pip,说明你用的不是虚拟环境里的 pip。这种情况下重新检查激活命令source venv/bin/activate,然后再次运行which pip,正常情况会指向虚拟环境目录。养成用which验证的习惯,能帮你快速定位各种"命令行为不对"的问题。
5.3 安装包时出现外部管理环境错误
新版 Ubuntu 里,系统 Python 的 pip 被限制安装了,因为它自带的 Python 环境受系统包管理器管控。如果你执行pip install requests时遇到"externally-managed-environment"这样的报错,不用慌张。
最优解是先建虚拟环境,再在虚拟环境内部安装,这样绕开系统级别限制,也符合"项目隔离"的理念。如果你确实需要全局安装且知道自己在做什么,可以加--break-system-packages参数,但我不推荐新手这样做。这个错误本质上是一个保护机制,告诉你"别动系统环境",实际上是在帮你养成好习惯。
5.4 文件权限导致的运行失败
前面提过 Permission denied 的问题。不少同学写完 Python 脚本,一执行./script.py就遇到这个错误。排查步骤很简单:先执行ls -l script.py查看文件的权限位。如果显示的权限是-rw-r--r--,说明属主没有执行权限,就需要chmod +x script.py来补上。
还有另一种情况:你在 Windows 下用编辑器写好的脚本,传到 Linux 里发现运行报错/usr/bin/env: 'python3\r': No such file or directory。这是因为 Windows 保存的文件换行符是\r\n,Linux 只识别\n。解决办法是用sed -i 's/\r$//' script.py去掉回车符,或者在编辑器里把换行符改成 LF。这类问题是 Windows 和 Linux 混用的初学者最容易踩的坑。
5.5 端口被占用的问题
过几天你会开始写 Web 服务,比如 Flask 或 FastAPI 的小项目,这时候大概率会遇到端口被占用的问题。报错内容是类似Address already in use。排查方法是先用ss -ltnp看当前监听端口的进程,找到对应的 PID 之后用kill命令结束它。
这里我的建议是:不要直接杀掉系统里不认识的进程,得先看清楚这个进程是什么、能不能杀。确认后才能执行清理操作。如果只是为了开发,可以直接使用另一个端口。这个排查思路对所有"某个端口起不来"的问题都适用。
5.6 常见问题速查表
为了方便随时翻阅,我把上面这些情况整理成一个速查表:
| 现象 | 可能原因 | 快速排查 | 解决办法 |
|---|---|---|---|
| command not found | 软件未安装或命令名错误 | ls /usr/bin/命令* | 安装对应软件或换正确命令 |
| Permission denied | 文件缺执行权限 | ls -l 文件名 | chmod +x 文件名 |
| 换行符导致的报错 | 文件是 Windows 格式 | cat -v 文件名 | sed -i 's/\r$//' 文件名 |
| pip 装包受限制 | 系统 Python 受管理 | which pip | 创建虚拟环境再安装 |
| 端口被占用 | 另一进程占用端口 | ss -ltnp | 换端口或结束对应进程 |
| 虚拟环境失效 | 未正确激活或配置冲突 | which pip | 重新source activate并检查 |
5.7 两个排查思路层面的建议
最后补充两个我自己总结的排查哲学。第一,遇到问题先看报错信息本身。报错信息里往往已经告诉了你原因和位置,不要急着去改代码或重新安装环境。新手最常犯的毛病是"看到报错就慌,然后卸载重装"。其实大多数问题都是一行命令就能解决的小事情。
第二,学会用"最小复现"去定位问题。如果你不知道 bug 出在哪,就创建一个最简脚本,逐步添加逻辑,看哪一步触发问题。这个思路不只是排查技巧,也是调试代码和设计系统的核心思维。很多经验丰富的开发者之所以解决问题快,不是因为记忆力好,而是因为他们懂得把大问题拆成小步骤逐一验证。
6. 经验感想与后续路径
6.1 我踩过的一些坑
说几个我早期学习 Python 和 Linux 时印象深刻的经历,也算给你们提个醒。
最开始我用的是 Windows,装了一个很老版本的 Python,然后按照网上教程装了一堆包。后面配合 Linux 使用时,发现很多命令行为不一致,最后才明白是 Python 版本差异造成的。当时浪费了一个下午排查一个"同一个代码,两个环境结果不一样"的问题。现在回想起来,如果早点用虚拟环境、早点统一版本,可能五分钟就解决了。
后来我慢慢形成一个习惯:每个新项目的第一件事是写好说明文档,把 Python 版本、系统版本、依赖包列表记清楚。有了这份说明书,项目在任何新环境上都能快速重建。你们现在可能觉得这个动作多余,但等到你同时维护三个项目、并且每隔几个月就要换电脑或重装系统的时候,会发现它是真正的救命稻草。
6.2 下一步可以怎么走
这一期内容属于整个路线的起步,覆盖了 Linux 基本操作、Python 环境搭建、虚拟环境、简单脚本以及常见问题排查。接下来我认为有两个明确方向可以继续深入。
第一个方向是继续加深 Python 的项目能力。比如用 Flask 写一个简单的 Web 接口,再把前面学的 Shell 命令和 Python 脚本结合起来,做一个自动化的定时任务。第二个方向是往部署方向走:学会用 Git 管理代码,再把项目部署到一台远程服务器上,让它的服务真的跑起来。这两个方向里,前者更偏写代码,后者更偏运维,但都会用到这期的基础功。
这里我还特别想强调一个事情:记笔记的方式。建议你从这期开始维护一个"命令速查"笔记,把见过的每一条有用的命令和用法记录下来。不要过分依赖搜索引擎,因为很多知识你查过一遍后过段时间还是会忘,但自己整理过的东西记忆会深刻许多。这个笔记不用很正式,随手记即可,关键是坚持。
6.3 保持节奏比天分重要
我接触过的很多学习者在前期都会有这样的体验:第一周热情高涨,第二周开始被细节绊住,第三周遇到一个卡住一晚上的问题就想放弃。这太正常了。
Linux 和 Python 的知识体系是典型的"面太广、上限太高",但入门门槛其实并没有想象中那么高。你不需要一天内掌握所有命令,也不必对着复杂的权限模型死磕。把前面提到的核心流程走一遍,每天积累一点点手感,之后的进阶会是水到渠成的事情。
这一期的内容到这里就结束了。我的个人建议是:先把环境搭起来,把今天的脚本敲完,然后尝试着自己改一改——比如让重命名脚本支持多个目录,或者把统计脚本的输出排序。自己动手写过一遍,和看别人写过一遍,学到的深度完全不一样。