🧮 第5章 环境搭建
📄 一句话概括

装 Python 只有一件事要搞清楚: 你敲 python 敲到的到底是哪一个。 Demo 打出当前环境的信息——版本 3.13.14、64 位、 可执行文件在哪个目录、是不是虚拟环境;再扫一遍 PATH,看上面有几份 python。 这台机器上只找到 1 份,但装过 Anaconda 之后就会变成两三行。

📝 本节和前面几节的关系

第 5 章是全书最后一章,也是最短的一章:装 Python、建虚拟环境、装第三方包。 三件事都很基础,但新手卡住的地方八成在这里,而不是在算法上。 前面四章的 Demo 全是在一个已经配好的环境里跑的;这一章讲那个环境是怎么来的。 如果你已经能跑通前面的代码,这一章可以快速过一遍,但第二节的虚拟环境别跳。

一、装哪一个:版本、位数、来源

版本:这本书的示例代码是 Python 3.7 加 scikit-learn 0.20.3 写的。 现在装当然用新版本(3.10 以上),但要知道一件事:库的版本和 Python 的版本是绑在一起的, 太新的 Python 可能还没有某些库的轮子。稳妥的选择是「比最新版落后一两个小版本」。 位数:一定装 64 位。 32 位 Python 单个进程最多用 2 GB 内存,跑稍微大一点的数据就 MemoryError, 而且报错信息不会告诉你「是因为你装了 32 位」。 来源:官网 python.org 或者微软商店都行,别从来路不明的「绿色版」装。 Windows 上装的时候有个选项叫「Add Python to PATH」, 建议勾上——勾了才能在命令行里直接敲 python。没勾也能补救,但要手动改环境变量。

二、装完先做三件事

第一,敲 python --version 看版本。 如果提示「不是内部或外部命令」,说明 PATH 没配好, 或者装的时候没勾那个选项。 第二,敲 where python(Windows)或 which -a python(macOS/Linux)。 这条会按 PATH 顺序列出所有能找到的 python。 只有一行最好,多行就要小心了——敲 python 用的是第一行那个。 第三,跑一句 python -c "import sys; print(sys.executable)"。 这行打出的是「这个 python 的可执行文件在哪」,是排查环境问题的第一把钥匙。 Demo 里第一张表的第二行就是这个。 还有个小坑:Windows 上有个 py 启动器, 敲 py --version 和 python --version 可能给出不同答案—— py 按自己的规则挑版本,和 PATH 不是一条路。 查哪个就用哪个命令,别混着用。

三、为什么推荐用虚拟环境而不是直接装在系统里

直接 pip install 到系统 Python 里当然能用,直到你同时做两个项目。 A 项目要 numpy 1.x,B 项目要 numpy 2.x,系统里只能留一个。 更糟的是改系统 Python 可能弄坏操作系统自己依赖的组件(Linux 上尤其危险)。 虚拟环境解决的就是这件事:每个项目一个独立目录,里面有自己的 Python 副本和自己的包仓库。 装坏了删掉重建,五分钟的事。 代价是每个环境都要重新装一遍依赖。这个代价用 requirements.txt 就能抹平——下一节会讲。

四、动手 Demo:先确认「我用的到底是哪个 Python」

这一段不装任何东西,只是把当前环境的信息打出来。 换一台机器、换一个环境,这些数都会变——所以要自己跑一遍,而不是照抄这里的输出。 四行代码:版本号、可执行文件路径、是不是 64 位、在不在虚拟环境里。 后面还会扫一遍 PATH,看上面到底有几份 python。

import os
import sys

print(sys.version_info[:3])       # 版本号,比如 (3, 13, 14)
print(sys.executable)             # 这个 Python 到底在哪个目录
print(sys.maxsize > 2 ** 32)      # True 就是 64 位
print(sys.prefix != sys.base_prefix)   # True 就是在虚拟环境里

# 这条命令能列出 PATH 上所有的 python,按找到的顺序
# where python        (Windows)
# which -a python     (macOS / Linux)

实跑输出:

--------------------------------------------------------------------
先把「我用的是哪个 Python」搞清楚
--------------------------------------------------------------------

  环境搭建这一章不讲算法,讲的是**把工具装对**。
  先说一个很多人栽过的坑:电脑上可能同时装着三四个 Python,
  **你敲 `python` 敲到的是哪一个,取决于 PATH 的顺序,不取决于你想用哪个。**

  【一】当前这个 Python 到底是谁
  项目            值
  ------------------------------------------------------------------------
  版本            3.13.14
  可执行文件      C:\Users\admin\.workbuddy\binaries\python\envs\default\Scripts\python.exe
  位数            64 位
  是虚拟环境吗    是(sys.prefix 和 base 不一样)
  site-packages   C:\Users\admin\.workbuddy\binaries\python\envs\default\Lib\site-packages
  **`sys.executable` 是最有用的一行。**
   当你怀疑「装了包却 import 不到」时,把它打出来,就能确认「我到底在给哪个 Python 装包」。
  位数那一行用 `sys.maxsize` 判断,这是老办法里最可靠的一个。
  32 位 Python 单个进程最多用 2 GB 内存,跑深度学习直接爆——
  **装之前先确认位数,能省掉后面一整天的排查。**

  【二】PATH 上的 Python 有几份
  序号  PATH 里的位置
  ------------------------------------------------------------------------
  1     C:\Users\admin\.workbuddy\binaries\python\versions\3.13.12\python.exe
  这台机器上只找到 **1** 份,所以没什么歧义。
  **但只要装过第二个 Python(比如后来又装了 Anaconda),这里就会变成两三行,那时就麻烦了。**
  **敲 `python` 永远用第 1 份**
  ——哪怕它不是你想用的那个。这就是「明明装了 pandas 却 import 不到」的经典原因。

  【三】三条命令,装完之后各查一次
  命令                                              它回答什么
  ----------------------------------------------------------------------------------------
  python --version                                  这个 python 是几点几版本
  where python(Windows)                           PATH 上有哪几份 python,按顺序列出来
  python -c "import sys; print(sys.executable)"     这一份 python 的可执行文件在哪
  **别用 `py --version` 代替 `python --version`。**
   Windows 上 `py` 是一个启动器,它按自己的规则挑版本,和 `python` 走的不是一条路。
  **查哪个就用哪个命令。**

第一张表里最有用的两行是「可执行文件」和「是虚拟环境吗」。 前者告诉你「东西装在哪儿」, 后者告诉你「会不会影响系统」。 Demo 这台机器上是在虚拟环境里的,sys.prefix 和 sys.base_prefix 不一样。 PATH 那一栏只找到 1 份 python。 这是好事——没什么歧义。 但只要你后来又装了 Anaconda,这里就会变成两三行,而且 Anaconda 常常把自己插到最前面, 于是 python 悄悄换了人。 位数是用 sys.maxsize 的数值大小判断的。 这个写法看着怪,但它比查注册表、比读环境变量都可靠, 而且跨平台。64 位机器上这个数是 9223372036854775807,32 位只有 2147483647,差着 43 亿倍。 最后那张三行表建议抄下来。 装完之后查一次、装包报错时查一次、 「明明装了却 import 不到」时再查一次。这三个命令能解决八成的环境问题。

30 秒实验

  1. 在你的机器上跑 where python,列出几行?第一行和 sys.executable 一致吗?
  2. 如果装了两个 Python,怎么让命令行默认用第二个?(提示:改 PATH 的顺序)
  3. 把 sys.maxsize 直接打印出来,这个数是多少?它和位数什么关系?

常见误区

  1. 装 32 位 Python。能装能用,直到数据大一点就 MemoryError,而且报错完全看不出是位数问题。 装之前确认 64 位。
  2. 把 py 和 python 当同一个命令。Windows 的 py 启动器按自己的规则挑版本, 和 PATH 上的 python 可能不是同一个。查哪个用哪个。
  3. 把所有包都装进系统 Python。短期省事,长期是灾难——版本冲突无解,还可能弄坏系统组件。 每个项目一个虚拟环境。
自测三问(点开对答案) 1. `python --version` 报「不是内部或外部命令」,最可能是什么原因? —— PATH 里没有 Python 的目录。 可能是安装时没勾「Add Python to PATH」,或者装了但没重启命令行(环境变量要新开窗口才生效)。 2. 为什么一定要装 64 位? —— 32 位进程的地址空间上限约 2 GB,数据一大就 MemoryError。 而且这个限制不会在报错里明说,很难排查。 3. `sys.executable` 有什么用? —— 它打出当前 Python 解释器的完整路径。 排查「装了包却 import 不到」时,先看它,就能确认「我到底在给哪个 Python 装包」。

Python 装好了,下一步是别把它装脏——5.2 节讲虚拟环境。

相关笔记