🧠 第三章 编程语言
📄 一句话概括

本机体检:Python 3.13.14、64 位、装了 90 个第三方包,安装目录 48.0 MB; 新建一个空 venv 只要 0.04 秒、0.5 MB,里面 import numpy 直接失败——隔离生效。

📝 本节和前面几节的关系

上一章说「编程技能是实现人工智能的关键所在」,这一节从最底层动手:把 Python 装上, 并且装完能说清它到底装到了哪里。

一、装 Python 到底装了什么

不是一个 exe,是三块东西加一堆环境变量: - 安装根目录:解释器本体 + 标准库。本机是 3.13.12 那个目录。 - site-packages:第三方包的家。本机在 envs/default 下面,和安装根目录不是同一个地方。 - Scripts:pip、python 这些可执行文件。PATH 里要能找到它,你敲 python 才有反应。 Demo 量了这些:安装目录一共 48.0 MB,装好的第三方包 90 个。 48 MB 里绝大部分是标准库,第三方包一个都没算进去——它们是单独占地方的。

二、版本号对不上是正常的

Demo 打出来的第一行是 3.13.14,可「安装根目录」那一行写的是 versions/3.13.12。 这不是错了:解释器从某个 3.13.12 的目录里起来,补丁版本已经升到 14,而虚拟环境的名字还留着老路径。 真实机器上这种「名字和版本不一致」非常常见。 所以判断环境不能只看目录名。 看 sys.version、看 sys.executable、看 sys.prefix——这三个才是权威。

三、装完先做三件事

第一件,看版本和位宽。 64 位还是 32 位决定了能用多大的内存、能不能装某些包。 Demo 读到 64 位。 第二件,看命令行能找到几个解释器。 Demo 里 python 和 python3 都找到了,指向同一个 exe; py 没有。py 是 Windows 的启动器,没有它不代表装错,只是没勾那个组件。 第三件,隔一个干净环境试试。 这是最有用的一步,下面单独说。 三件事做完,你才知道「我这台机器上的 Python」和「书上写的 Python」是不是同一个东西。 这一步花两分钟,能省掉后面几小时的「在我这儿明明是好的」。

四、为什么要隔一个干净环境

所有包都装在一个全局环境里,迟早出事:A 项目要 numpy 1.x,B 项目要 2.x,装哪个都得罪另一个。 venv 就是给每个项目分一间房:自己的解释器入口、自己的 site-packages,跟外面互不干扰。 Demo 建了一个空 venv:0.04 秒,占 0.5 MB。然后在里面 import numpy —— 失败。 这就是隔离生效的证据。 0.5 MB 是因为这次没装 pip。带 pip 的完整 venv 会大不少,但也就几十 MB,几十毫秒的事。 这笔开销换来「换项目不用重装系统」,非常值。

五、动手 Demo:体检这台机器上的 Python

读本机解释器的版本、位宽、三个关键路径、已装包数量、安装目录体积; 再到命令行上找一遍 python/python3/py; 最后真建一个空 venv,量它的耗时与体积,并在里面试一次 import numpy。

import sys, sysconfig, shutil, struct
import importlib.metadata as md

print(sys.version.split()[0], struct.calcsize('P') * 8, '位')
print('标准库', sysconfig.get_paths()['stdlib'])
print('第三方包', sysconfig.get_paths()['purelib'])

names = {d.metadata['Name'] for d in md.distributions()}
print('已装包', len(names))

for cmd in ('python', 'python3', 'py'):
    print(cmd, shutil.which(cmd))

venv.EnvBuilder(with_pip=False).create(vdir)
subprocess.run([vpy, '-c', 'import numpy'])   # 看返回码

实跑输出:

--------------------------------------------------------------------
体检这台机器上的 Python:装了几个、多大、能不能隔出干净环境
--------------------------------------------------------------------
  版本                     3.13.14
  位宽                     64 位
  解释器                   C:\Users\admin\.workbuddy\binaries\python\envs\default\Scripts\python.exe
  安装根目录               C:\Users\admin\.workbuddy\binaries\python\versions\3.13.12
  标准库在哪               C:\Users\admin\.workbuddy\binaries\python\versions\3.13.12\Lib
  site-packages            C:\Users\admin\.workbuddy\binaries\python\envs\default\Lib\site-packages
  已装第三方包             90 个
  整个安装目录             48.0 MB

  命令行里能找到的解释器:
  命令      结果   指向
  --------------------------------------------------------------------------------------
  python    找到   C:\Users\admin\.workbuddy\binaries\python\versions\3.13.12\python.EXE
  python3   找到   C:\Users\admin\.workbuddy\binaries\python\versions\3.13.12\python3.EXE
  py        没有   -

  建空 venv 耗时           0.04 秒
  空 venv 体积             0.5 MB
  在 venv 里 import numpy  失败——隔离生效
  venv 自己的 sys.prefix   v

  结论:装 Python 不是「装个软件」,是装一套【解释器 + 标准库 +
  第三方包 + 一堆环境变量】。体检先看三样:版本、位宽、装了几个。

版本行是 3.13.14,安装根目录却是 versions/3.13.12——目录名是老的,解释器是新的。 别拿目录名当版本。 标准库和 site-packages 在两个完全不同的父目录下:一个在 versions,一个在 envs。 这就是虚拟环境的实际样子——共用解释器,分开装包。 python 和 python3 都指向同一个 exe,py 找不到。 这不影响使用,但说明这台机器上 Windows 启动器没装。 空 venv:0.04 秒、0.5 MB,import numpy 返回非 0——隔离确实生效。 带 pip 会慢一些、大几十 MB,道理一样。

30 秒实验

  1. 在你自己的机器上跑一遍 sysconfig.get_paths(),把 stdlib 和 purelib 抄下来, 看它们是不是同一个盘。
  2. 建一个 venv,进去了 pip list 看有几行,再 deactivate 出来对比。
  3. 想一想:为什么虚拟环境要「共用解释器」而不是复制一份?

常见误区

  1. 「装完能 import 就行」——不知道包装在哪,出问题只能重装。
  2. 「目录名叫 3.13.12,那版本就是 3.13.12」——目录名不会跟着升级改。
  3. 「全局装一套最省事」——两个项目要不同版本时,一套环境必然打架。
自测三问(点开对答案) 1. 判断 Python 环境看哪三个值? —— `sys.version`、`sys.executable`、`sys.prefix`;目录名不可靠。 2. 虚拟环境隔离的到底是什么? —— 隔离 site-packages(装包的位置),解释器本体是共用的。 3. 怎么证明隔离真的生效了? —— 在一个只有标准库的新环境里 import 第三方包,应该失败。

Python 装好,下一步是把它的位置写进环境变量,让命令行真能找到它。

相关笔记