Python 开发中最具“仪式感”的动作:环境穿越 venv
评论
收藏

Python 开发中最具“仪式感”的动作:环境穿越 venv

经验分享
r
rary
2026-04-21 18:17·浏览量:227
r
rary
影刀中级开发者
发布于 2026-04-21 18:17227浏览

这个问题问到了 Python 开发的**“地基”**。很多新手写代码报错,其实不是逻辑问题,而是“库装错地方了”。

在 Python 中,安装库就像是**“给房子买家具”**,你可以买在公共大厅(全局环境),也可以买在自己的小卧室里(虚拟环境)。


A. 仓库(安装位置/存储):库可以安装在哪里?(三个核心位置)

A. 全局环境 (Global Site-Packages)

  • 路径: 通常在 Python 安装目录下(如你之前的 AppData\Local\Python\pythoncore-3.14-64\Lib\site-packages)。

  • 路径查看: * 在终端输入:where python (Windows):这个命令会显示你 Python 安装的根目录。库就在这个目录下的 Lib\site-packages 文件夹里。

  • 特点: 在这里安装库,你电脑上所有的 Python 项目都能用到它。

  • 逻辑: 系统全局 (The System Hall),相当于手机出厂自带的系统 App 目录。

  • 风险: 容易产生“版本冲突”。比如项目 A 需要 Playwright 1.0,项目 B 需要 2.0,装在全局就会打架。

  • 什么时候用: 几乎不用。除非你想让电脑上所有项目都共用某一个库。场景:日常练习 / 简单的脚本。理由:省事,不用每次新建环境,常用库(如 requests, pandas)随调随用。

B. 用户环境 (User Site-Packages)

  • 路径: 在用户个人文档目录下(%APPDATA%\Python)。

  • 路径查看:* 在终端输入:python -m site --user-site它会直接吐出一个路径,通常在 %APPDATA%\Python\Python314\site-packages

  • 安装到用户目录: pip install --user playwright

  • 特点: 当你没有管理员权限,或者用 pip install --user 时,库会装在这里。

  • 逻辑: 用户级 (The User Room):相当于你登录了自己的手机账号,安装了一些只有你能用的 App。

  • 什么时候用: 当你没有系统管理员权限,或者只想给当前登录的电脑用户安装时。场景:开发工具 / 命令行工具。理由:比如代码格式化工具、Linters 等。

终端示例:

C:\Users\Administrator>python -m site --user-site
C:\Users\Administrator\AppData\Roaming\Python\Python314\site-packages
  • AppData\Roaming: 这是 Windows 的“个人行李舱”。无论你把软件安装在 D 盘还是 E 盘,软件产生的“属于你个人的数据”都会存放在这里。

  • Python\Python314: 这说明这一层是专门为 Python 3.14 版本准备的。如果你电脑上还装了 Python 3.10,它会另开一个 Python310 的文件夹。

  • site-packages: 这是全 Python 通用的术语,专门指存放第三方库(如 Playwright, Pandas)的文件夹


C. 虚拟环境 (Virtual Environment / venv) —— 最推荐

  • 路径: 在你的项目文件夹内部(比如 project3\.venv)。

  • 路径查看: * 通常就在你的项目文件夹里,比如 C:\Users\丰芑\Desktop\project3\.venv\Lib\site-packages

  • 特点: 这是一个**“独立的小隔间”**。你在这里装的任何库,都不会影响外面的世界,外面也不会影响这里。

  • 逻辑: 相当于手机里的“应用分身”或“沙盒”。比如你为了测试 Temu 爬虫,专门开了一个独立空间,里面装的库只供这个爬虫使用。

  • 什么时候用: 永远建议使用。 每一个独立的项目(比如股票分析一个环境,Temu 爬虫一个环境),互不干扰。场景:正式项目 / 影刀集成 / 爬虫。理由:这样你的项目在迁移、打包或分发给别人时,不会因为缺库或版本不对而崩溃。


如何指定安装到哪里?

方法 1:使用 pip 指令控制

  • 默认安装: pip install playwright(通常装在当前激活的环境)。

  • 安装到用户目录: pip install --user playwright

  • 安装到特定目录(不常用): pip install --target D:\my_libs playwright

方法 2:指定具体的 Python 解释器(最保险)

如果你电脑上有多个 Python,用这个方法能精准定位:

PowerShell

# 确保装在你那个 3.14 版本的全局目录下
C:/Users/丰芑/AppData/Local/Python/pythoncore-3.14-64/python.exe -m pip install playwright


B. 搬运工(解释器/python.exe)

这就是你选的那个 python.exe。它是一个活的进程,它唯一的工作就是:去仓库拿食材,然后按照你的菜谱(代码)把它炒出来。

每一个解释器(python.exe)都有一个属于自己的“势力范围”

当你运行某一个特定的 python.exe 时,它会默认去几个固定的地方找库。这就像是一个**特工(解释器)只去特定的安全屋(安装位置)**取情报。

情况 A:全局解释器 (D:\python.exe)

它的势力范围包括:

  1. 它自己的家D:\Python314\Lib\site-packages(第一层:全局)。

  2. 用户的公用行李舱C:\Users\...\Roaming\Python\site-packages(第二层:用户级)。

  3. 注意:看不见任何虚拟环境(venv)里的库。

情况 B:虚拟环境解释器 (project3.venv\Scripts\python.exe)

它的势力范围包括:

  1. 它那个小隔间project3\.venv\Lib\site-packages(第三层:虚拟环境)。

  2. (可选)家里的资产:如果你在创建时设置了,它也能看见第一层和第二层,但通常它是完全隔离的。

深度拆解:解释器如何知道去哪找库?

每一个 python.exe 旁边通常都跟着一个“导航文件”。

  • 全局 Python:它内置了硬编码的路径。

  • 虚拟环境 Python:在 .venv 文件夹里有一个 pyvenv.cfg 文件。你可以尝试手搓打开它,里面有一行: include-system-site-packages = false

  • 如果是 false(默认值),它就只看虚拟环境内部,不看 D 盘。

  • 如果是 true,它才会把 D 盘的库也包含进来。


C. 导航地图(sys.path / 配置)

当你在代码里写 import playwright 时,Python 是按什么顺序找库的?

如果你不确定当前的解释器可以看到哪些库,不要猜!直接问它。在你的代码里写这两行:

Python

import sys
print(sys.path)

运行结果会吐出一串路径列表。凡是没在这个列表里的文件夹,里面的库你通通调不动。

或者你可以运行这段代码来看看 Python 的**“搜索清单”**:

Python

import sys
for path in sys.path:
    print(path)

你会发现排序通常是:

  1. 当前目录(你写代码的那个文件夹)。

  2. 第三层:虚拟环境(如果你开启了 venv)。

  3. 第二层:用户级(就是你刚刚查到的这个 Roaming 路径)。

  4. 第一层:全局(你 D 盘的那个真身路径)。

示例:


3️⃣ 手把手教你:如何精准管理路径

Step 1: 确定你现在“人在哪个环境”

在终端(PowerShell)输入以下命令,看看到底是哪个 Python 在干活:

PowerShell

python -c "import sys; print(sys.executable)"
  • 如果返回的是 ...\project3\.venv\Scripts\python.exe,说明你在虚拟环境

  • 如果返回的是 ...\AppData\Local\Python\...,说明你在全局环境

Step 2: 确定你的库“装在哪”

输入以下命令查看当前环境下已经安装的所有库及其位置:

PowerShell

pip list -v
  • 注意看最后一列 Location,它会清清楚楚地告诉你每一个库躺在哪个文件夹里。

  • 找到库的路径: 通过 pip list -v 发现 playwright 装在了 C:\Users\用户名\AppData\Local\Python\pythoncore-3.14-64\Lib\site-packages

Step 3: “解释器路径”和“库路径”必须对齐

  • 告诉 VS Code: * 点击 VS Code 右下角的 Python 版本号(或者按 Ctrl+Shift+PSelect Interpreter)。

  • 必须选择 那个路径前缀也是 C:\Users\用户名\AppData\Local\Python\pythoncore-3.14-64\ 的解释器。


reportMissingImports 报错,是因为搬运工(解释器/python.exe)找不到仓库了

你的诊断思路应该是:

第一步:查安装位置,看货在哪里?(定位仓库)

运行 pip show 库名。看它的 Location 是在 D 盘还是 C 盘。

示例:在终端运行:pip show playwright

  • 记下它的 Location。比如:D:\Python314\Lib\site-packages

第二步:看搬运工在看哪?(核对地图)

在你的 Python 脚本里加上这两行并运行:

Python

import sys
print(sys.path)
  • 这是最关键的一步! 看看打印出来的路径列表里,有没有你在第一步记下的那个 Location

第三步:连线(修正配置)

对齐解释器:在 VS Code 里按 Ctrl+Shift+P 选解释器时,确保选中的那个 Python 能够覆盖到这个 Location
另一种说法:对齐编辑器:在 VS Code 里把解释器切换到 D:\python.exe

  • 如果不包含:说明你选错搬运工了!去 VS Code 右下角换一个解释器,直到 sys.path 里出现了你货物的存放路径。

  • 如果包含还报错:说明货物损坏了,尝试重装库。

为什么解释器和安装位置不是“死”对应的?

这是为了灵活性

  • 一个“全局搬运工”可以被配置成“既能看全局大仓库,也能看个人行李舱”。

  • 一个“虚拟环境搬运工”可以被配置成“闭关锁国(只看自己)”,也可以配置成“海纳百川(也看全局)”。

搬运工是谁(哪个 exe)不重要,重要的是他手里的那张地图(sys.path)写了哪些仓库地址。
示例:

此示例看到playwright库的location是包含在解释器的地图中的。 深度分析:你的搬运工在看哪?

你运行的是 D:\python.exe,根据你打印出的 sys.path,你的搬运工手里只有这几张地址条:

  1. c:\Users\Administrator\Desktop\project

  • 含义:当前文件夹。搬运工会先在你的桌面上找有没有库。

  • D:\LibD:\Lib\site-packages

  • 含义:这就是第一层:全局大仓库

  • 结论:所有你通过 D:\python.exe -m pip install 安装的库,只要进了这个文件夹,都能被找到。

  • 其他的 D:\DLLs

  • 含义:这是 Python 的“内脏”,维持基本运行的,不用管它。

另外解决方案 :给搬运工塞一张“临时临时地图”(最黑客)

如果你不想重装库,可以在代码最开头,强行把 C 盘地址告诉搬运工:

Python

import sys
# 手动把仓库地址贴到地图上
sys.path.append(r"C:\Users\Administrator\AppData\Roaming\Python\Python314\site-packages")

import playwright # 现在他就能找到了!

在你的 textsys.py 开头加上那行 sys.path.append,看看是不是真的能成功 import 那些之前报错的库了?这种“手动改地图”的操作会让你对路径的理解深进骨子里。


命令行操作中的**“当前工作目录”(Current Working Directory, CWD)**概念

1️⃣ 什么叫“在 project 目录下”?

在终端(PowerShell 或 CMD)里,左侧那串路径就是你当前的位置。在手搓代码的世界里,“你在哪儿”直接决定了你“命令执行的对象是谁”。

  • 影刀类比:这就像你在影刀里打开了一个特定的“应用项目”。

  • 文件系统类比:就像你用鼠标双击打开了 D:\project3 文件夹,然后看着里面的文件。

当你运行 python -m venv .venv 时,这个命令是一个相对路径操作。它会在你**“当前站着的这个位置”**,原地挖个坑,建一个名为 .venv 的文件夹。

警告: 如果你当前在 C:\Windows\System32 下运行这个命令,它就会在那儿建虚拟环境(而且大概率会因为没权限报错)。所以,操作前看一眼左边的路径是职业习惯。


实战:如何“手搓”一个虚拟环境?“手搓”操作规范

第一步:建项目文件夹 (project)

第二步:创建 (The Creation)

在终端输入:python -m venv .venv

(这会在你的 project 文件夹里生成一个 .venv 文件夹,里面是一套干净的 Python 副本)。

PowerShell

python -m venv .venv
  • python: 调用你的 D 盘搬运工。

  • -m venv: 告诉搬运工:“我要使用 venv 这个内置工具来盖一间新房子”。

  • .venv: 这是房子的名字。加个“点”是为了让它在某些系统下隐藏,不干扰你看代码。

  • 结果:你的 project 文件夹里多了一个目录,里面复制了一份 python.exe 和一套干净的“仓库”。

第三步:激活 (The Activation)

激活它:Windows: .\.venv\Scripts\activate激活后,你的终端路径前会出现 (.venv) 标志。

PowerShell

.\.venv\Scripts\activate
  • .\: 意思是“就在当前文件夹下”。

  • 逻辑:这步操作就像是**“切换电闸”。没激活前,python 指向 D 盘;激活后,在这个终端窗口里,python 指令会被重定向**到你刚建的 .venv 内部。

  • 标志:看到前面的 (.venv) 了吗?那是系统在提醒你:“现在的搬运工已经换成项目专有的那个了”。示例:

第四步:局部安装 (Local Installation)

在环境里面安装库:此时运行 pip install playwright,库就存在于这个项目中了。

PowerShell

pip install playwright
  • 关键点:因为环境已激活,这个 pip 会把 Playwright 塞进 .venv\Lib\site-packages

  • 好处:这叫**“闭关锁国”**。无论你在外面(D 盘或 C 盘)装了什么,都不会影响这个项目。当你把整个 project 文件夹拷给别人,只要他们也激活环境,配置就是一模一样的。

第五步:关联编辑器 (The Link)

在 VS Code 里关联,选这个环境的解释器: Ctrl + Shift + P 选解释器,选那个路径带有 project\.venv 的。

VS Code 默认可能还在看全局环境的搬运工。你需要按 Ctrl+Shift+P 选那个路径里带有 project\.venv 的解释器。

  • 意义:让“设计师(VS Code)”和“搬运工(.venv 里的 Python)”看同一张地图。


关于第三步激活的拓展知识:

1️⃣ 激活的本质:修改“临时寻宝图”

为什么输入 .\.venv\Scripts\activate 后,原本指向 D 盘的 python 命令就变了呢?

当你运行 activate 脚本时,它其实只做了一件核心动作:修改当前终端窗口的 PATH 环境变量。

  • 激活前:你的 PATH 寻宝图第一位是 D:\

  • 激活后:脚本把 .venv\Scripts 这个路径强行插队到了寻宝图的第一位。

所以,当你再次输入 python 时,系统按照寻宝图从上往下找,在第一站 .venv\Scripts 就找到了 python.exe,于是直接运行它,不再往下找 D 盘的了。


1️⃣ 进入新世界:激活虚拟环境 (Activate)

在你的 project 目录下,输入:

PowerShell

.\.venv\Scripts\activate
  • 观察变化:你会看到命令行最左侧出现了 (.venv) 字样。

  • 执行验证:接着输入 pip list,你会发现列表空空如也(通常只有 pipsetuptools)。


2️⃣ 回到现实世界:关闭虚拟环境 (Deactivate)

方法 A:优雅退出(Deactivate)

在你当前的终端(那个前面带着 (.venv) 的窗口)里,直接输入一个单词:

PowerShell

deactivate
  • 原理:这个命令会把插队的那个 .venv 路径从 PATH 里踢出去,恢复成原来的样子。

  • 标志:你会发现前面的 (.venv) 消失了。此时输入 where python,你会发现它又指回 D:\python.exe 了。

  • 执行验证:再次输入 pip list,你会看到你 D 盘全局环境里那一大串“家当”又回来了。

方法 B:暴力退出(关掉窗口)

  • 虚拟环境的激活是“窗口级别”的。它只对你当前这个黑乎乎的终端窗口有效。

  • 如果你关掉这个终端,重新开一个新的,或者新开一个 Tab 页,它默认还是指向 D 盘的(因为你没在那个新窗口里运行 activate)。


3️⃣ 进阶手搓:如果不激活,能用虚拟环境吗?

能!而且这是高手常用的做法。

“激活”只是为了让你少打几个字(不用每次都写长路径)。如果你不激活,但又想用虚拟环境里的那个搬运工,你可以直接用绝对路径

PowerShell

# 不激活也能运行虚拟环境里的 Python
C:\Users\Administrator\Desktop\project\.venv\Scripts\python.exe textsys.py

这种写法在影刀或者任务计划程序里非常常用。因为程序不像人,它不需要 (.venv) 这种视觉提醒,它只需要一个精确的地址。


🛠️ 常见的小坑(手搓避坑指南)

A: 如果报错“无法加载文件...”: 这是因为 Windows 默认禁止运行脚本。这是 Windows PowerShell 的一个**“安全锁”**。默认情况下,Windows 为了防止恶意脚本自动运行,禁止执行任何 .ps1 文件(也就是你看到的 Activate.ps1)。这就像是实验室的门锁上了,你得先给自己授权一把“钥匙”。

🛠️ 解决方法:一键解锁

在你的 PowerShell 窗口中,直接复制并运行下面这行指令:

PowerShell

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
  • 这行代码的意思是:允许执行你自己在本地编写的脚本,或者来自互联网且经过数字签名的脚本。

  • -Scope CurrentUser:这只会修改你当前登录账号的权限,不会影响整个系统的安全。

B: 它是“窗口限制”的: 如果你开了两个 PowerShell 窗口。窗口 A 激活了,窗口 B 没激活。

  • 在窗口 A 运行脚本,用的是 .venv 的库。

  • 在窗口 B 运行脚本,用的是 D 盘的库。 所以,每个新窗口都要重新 activate 才会生效。


🧠 总结你的疑问

  1. 激活的目的:是为了让当前终端的 pythonpip 命令自动指向项目私有的仓库,防止你误操作到全局 D 盘。

  2. 重定向:是的,通过修改 PATH 优先级实现的临时重定向。

  3. 切回 D 盘:输入 deactivate 或直接重开一个新终端。

你可以现在试一下:先输入 deactivate 看标志消失,再输入 where python。这种在不同“搬运工”之间反复横跳的掌控感,是手搓复杂项目的基础!

你现在可以尝试在 project 目录下激活 venv,然后运行 pip list。你会发现里面只有 2 个最基本的库。然后你再 deactivate 退出,再运行 pip list,你会看到 D 盘那一大串库。这个对比会让你瞬间明白:venv 就是一个干干净净的新世界。


进阶手搓:我就想让 venv “白嫖”全局库,行吗?

其实是可以的。在创建虚拟环境时,有一个“后门”开关:

PowerShell

# 创建时加上这个参数
python -m venv .venv --system-site-packages
  • 逻辑:这样建出来的 venv,它的搬运工在找库时,会先找自己小口袋里的,如果找不到,再去 D 盘大仓库里找。

  • 评价:这实现了你想要的“通用”,但在专业开发中不推荐,因为它打破了隔离性,容易导致环境变得不可控。


收藏1
全部评论1
最新
发布评论
评论