📊 第2章 搭建 Python 数据分析环境
📄 一句话概括

「python 不是内部或外部命令」不是没装,是装了但系统不知道去哪找——两件事,修法完全不同。 系统靠 PATH 这串目录找命令。本机 PATH 有 41 条,python 找得到,py 和 conda 找不到。 改完 PATH 必须重开命令行窗口,已经开着的窗口读的还是旧值。

📝 本章和前面几章的关系

这一篇短,但它是新手最常卡住的地方。 看懂这个报错,等于拿到一把通用的钥匙——后面装任何命令行工具,排错思路都一样。 文中的 PATH 条数与命令查找结果都是本机实跑出来的。

一、报错在说什么

你敲 python,系统回答:'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。 这句话的准确含义是:系统在 PATH 列出的目录里,没找到名叫 python 的程序。 它不是「Python 没装」,而是「装了,但系统不知道去哪找」。

这两件事差别很大:前者要重装,后者只要改一个环境变量。先分清,再动手。

二、PATH 是什么

PATH 是一串目录,用分号隔开。你敲任何命令,系统就按这串目录挨个找。 本机的 PATH 有 41 条。每装一个新工具,通常就是往这串里加一条。 装 Python 时勾了 Add Python to PATH,安装程序会加两条:Python 目录和它下面的 Scripts。

没勾也能事后补:系统属性 → 环境变量 → 编辑 Path → 新建两条。 注意用户变量和系统变量的区别:只给当前用户装的话,变量写在用户那一栏,换个账户就没了。

三、现场查一遍

六个命令,逐个查它们能不能在 PATH 里找到:

命令 本机结果 说明
python 找到 指向 3.13.12 的 python.EXE
python3 找到 同一个目录,另一个名字
py 没有 Windows 启动器,装了通常有
pip 没有 要用 python -m pip 代替
ipython 没有 IPython 的命令行入口,不在 PATH
conda 没有 没装 Anaconda

「没有」不等于不能用。ipython 不在 PATH 里,但装了 IPython 之后照样能 import。 PATH 管的是「命令行能不能直接敲」,不管「Python 里能不能 import」。

四、三个最常见的坑

坑一:装的时候勾了「仅为当前用户」,PATH 只写进用户变量。换个账户登录,又得重来。 坑二:装了多个版本,PATH 里靠前的那个先被用上。你以为在用新版,其实在用旧版。 坑三:改完 PATH 没重开命令行。已经开着的窗口读的还是旧值,改一百遍也没用。

三条都指向同一件事: 先用 where python(Windows)或 which python(Linux/macOS)确认到底在用哪一个。

五、修好了怎么验

重开一个命令行窗口,敲 python -V。能打出 3.x 的版本号,就修好了。 再敲 python -m pip -V,看它指向的是不是同一个 Python。 两个版本不一致是下一个坑:pip 装到 A,python 用 B,装完就是 import 不到。

pip 和 python 必须成对。这一条能解释一大半「明明装了却用不了」。

六、动手 Demo:「python 不是内部或外部命令」是怎么回事

用 shutil.which 模拟系统找命令的过程,逐个查六个常用命令。 顺便打出 PATH 有多少条,看它有多长。

import os
import shutil

print("PATH 共 %d 条" % len(os.environ.get("PATH", "").split(os.pathsep)))

for exe in ["python", "python3", "py", "pip", "ipython", "conda"]:
    p = shutil.which(exe)
    if p:
        print("%-8s 找到  %s" % (exe, p))
    else:
        print("%-8s 没有" % exe)

实跑输出:

--------------------------------------------------------------------
「python 不是内部或外部命令」是怎么回事
--------------------------------------------------------------------

  ① 报错在说什么
  --------------------------------------------------------------------
  这句报错的字面意思是:系统在 PATH 列出的那些目录里,没找到一个叫 python 的程序。
  它不是「Python 没装」,而是「装了,但系统不知道去哪找」。
  ! 这两件事差别很大:前者要重装,后者只要改一个环境变量。

  ② PATH 是什么
  --------------------------------------------------------------------
  PATH 是一串目录,用分号隔开。你在命令行敲任何命令,系统就按这串目录挨个找。
  本机的 PATH 有 41 条。
  装 Python 时如果勾了 Add Python to PATH,安装程序会往这串目录里加一条。
  ! 没勾也能事后补:把 Python 的安装目录和它下面的 Scripts 目录都加进去。

  ③ 现场查一遍:哪些命令找得到
  --------------------------------------------------------------------

| 命令 | 状态 | 解析到哪个目录 |
|---|---|---|
| python | 找到 | python.EXE(3.13.12) |
| python3 | 找到 | python3.EXE(3.13.12) |
| py | 没有 | — |
| pip | 没有 | — |
| ipython | 没有 | — |
| conda | 没有 | — |

  找到的会显示文件名和它所在的目录名,找不到的打「没有」。
  注意 pip 这一行可能是「没有」——这台机器上没有单独的 pip.exe,要用 python -m pip 这种写法。
  ! py 是 Windows 的启动器,装了 Python 通常会有;它不在 PATH 里也不影响 python 命令。

  ④ 三个最常见的坑
  --------------------------------------------------------------------
  坑一:装的时候勾了「仅为当前用户」,PATH 只写进用户变量,换个账户就没了。
  坑二:装了多个版本,PATH 里靠前的那个先被用上,你以为在用新版其实是旧版。
  坑三:改完 PATH 没重开命令行。已经开着的窗口读的还是旧值。
  ! 三条都指向同一件事:先用 where python(或 which python)确认到底在用哪一个。

  ⑤ 验证修好了没有
  --------------------------------------------------------------------
  重开一个命令行窗口,敲 python -V。能打出 3.x 的版本号,就修好了。
  再敲 pip -V,看它指向的是不是同一个 Python——两个版本不一致是下一个坑。
  ! pip 和 python 必须成对。pip 装到 A、python 用 B,是最费时间的一类故障。

shutil.which 做的事和命令行一模一样:按 PATH 顺序找,返回第一个命中的。 结果会因机器而异,你跑出来可能和本文不同,这很正常——PATH 本来就是每台机器一份。

30 秒实验

  1. 把 PATH 里的条目按顺序打出来,看看 python 在第几条被找到。
  2. 临时把 PATH 清空(os.environ['PATH'] = ''),再试 shutil.which('python'),会返回什么?
  3. 想一想:为什么「装完了但命令找不到」这种情况,比「根本没装」更难排查?

常见误区

  1. 一看报错就重装:九成情况是 PATH 的事,重装反而可能装出第二个版本,更乱。
  2. 改完 PATH 不重开窗口:老窗口读的是启动时的环境变量快照。
  3. 只看 python -V 不看 pip -V:两个不配对,后面装什么都是错的。
  4. 把 PATH 里塞一堆重复项:越乱越难排查,多余的要删。
自测三问(点开对答案) 1. 「python 不是内部或外部命令」到底是什么问题? —— 系统在 PATH 的目录列表里找不到名为 python 的程序。可能没装,但更常见的是装了没加进 PATH。 2. 为什么改完环境变量必须重开命令行窗口? —— 因为已经打开的窗口在启动时复制了一份环境变量,之后系统再改它也不会同步。 3. ipython 命令找不到,是不是说明 IPython 没装? —— 不一定。PATH 只管命令行入口,import 走的是 sys.path。两套机制,别混。

命令行能跑通之后,下一个问题是「在哪写代码」。 下一篇讲 PyCharm——它其实只做了四件事,一件都不神秘。

相关笔记