多版本Python共存时怎么在cmd指定版本运行脚本
详细讲解在Windows命令提示符(cmd)中,当安装了多个Python版本时如何精准指定特定版本运行脚本。涵盖Python启动器(py命令)、绝对路径调用、虚拟环境管理及常见问题排查。
核心结论:在 Windows 命令提示符(cmd)中,解决多版本 Python 共存调用的最佳且标准方案是使用系统内置的 Python 启动器——即 py 命令(如 py -3.8 script.py 或 py -3.11 script.py)。此外,直接使用解释器的完整路径或为特定项目创建独立虚拟环境(venv),也是完全可靠且隔离度极高的方案。
设想一个非常普遍的开发情境:你的电脑上为了维护旧系统安装了 Python 3.8,同时为了学习新特性又安装了 Python 3.12。当你在 cmd 中输入 python main.py 时,系统只会根据系统环境变量 PATH 的排列次序,执行排在最前方的那个 Python 解释器。这就导致你明明希望用 3.8 跑脚本,系统却默认用 3.12 启动并抛出一堆兼容性报错。
遇到这种情况,很多初学者会盲目去把安装目录下的 python.exe 重命名为 python38.exe 或 python312.exe。这种做法不仅会破坏后续使用 pip 和内置模块的标准行为,还容易引发安装包路径紊乱。事实上,Windows 官方早已提供了极其规范的多版本调度工具和运行机制。
方法一:使用 Windows 官方 Python 启动器(py 命令)
在安装官方 Python Windows 安装包时,安装器默认都会勾选安装“Python Launcher for Windows”。它的可执行文件是 py.exe,安装在系统全局路径(通常位于 C:\Windows\py.exe)。这意味着即便你完全不把任何 Python 目录加入环境变量 PATH,py 命令也可以在任何 cmd 窗口随时被唤醒。
1. 查看当前已安装并注册的所有 Python 版本
打开 cmd 窗口,输入以下命令:
py --list
或者查看更详细的安装路径:
py --list-paths
命令运行后,cmd 会列出检测到的全部版本,带有星号 * 的表示当前默认版本。示例输出如下:
-V:3.12 * Python 3.12 (64-bit)
-V:3.8 Python 3.8 (64-bit)
2. 精准指定版本运行目标脚本
利用 -版本号 参数,你可以随心所欲调用任意已安装的解释器运行脚本:
:: 指定使用 Python 3.8 运行当前目录下的 test.py
py -3.8 test.py
:: 指定使用 Python 3.12 运行同一脚本
py -3.12 test.py
:: 如果只关心主版本,可以指定大版本号(会自动寻找该大版本下的最新安装版本)
py -3 test.py
3. 为指定版本安装和管理第三方依赖
多版本共存最容易踩坑的就是库安装混淆:使用 pip install xxx 常常装到了另一个版本的库文件夹里。利用 py -X.Y -m pip,能确保绝对安装到指定版本的标准库目录下:
:: 为 Python 3.8 安装 requests 库
py -3.8 -m pip install requests
:: 为 Python 3.12 安装 numpy 库
py -3.12 -m pip install numpy
:: 查看 Python 3.8 对应的已安装库列表
py -3.8 -m pip list
4. 利用 Shebang 语法实现“写在代码里”的自动选择
如果你希望某个脚本无论谁在 Windows 上运行,都能自动以指定的版本执行,可以在 .py 脚本文件的第一行加入 Shebang 注释:
#!python3.8
import sys
print("当前运行版本:", sys.version)
当你拥有 Shebang 之后,在 cmd 中直接敲 py main.py,启动器就会解析首行指定的版本 python3.8,并自动唤醒该解释器运行,无需在命令行手动输入 -3.8。
方法二:使用完整绝对路径直接调用
在编写自动化任务计划、批处理脚本(.bat)或在其他程序中调用 Python 脚本时,依赖启动器或 PATH 可能存在环境变动的风险。此时,直接指定 Python 解释器的物理绝对路径是最具确定性的方式。
首先通过 cmd 获取对应 Python 的实际安装路径:
where python
或者查看官方默认安装路径。通常 Windows 上的标准安装位置为:
- 当前用户独立安装:
C:\Users\用户名\AppData\Local\Programs\Python\Python38\python.exe - 所有用户安装:
C:\Program Files\Python38\python.exe
找到路径后,直接在 cmd 中将路径用英文双引号包裹(防止路径中的空格引发截断),后接脚本文件路径:
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38\python.exe" C:\Workspace\my_script.py
避坑提示:绝对不要通过复制一份并将文件改名为 python38.exe 来方便调用。很多 Python 模块(尤其是安装编译型轮子或生成控制台脚本入口时)会硬编码检测名为 python.exe 的可执行文件。如果随意改名,往往会导致 pip 无法自举、部分 C 扩展模块报错等难以排查的问题。
方法三:工程化最佳实践——为项目创建 venv 虚拟环境
在严肃的开发流程中,直接使用全局 Python 运行脚本往往会导致依赖污染。多版本 Python 共存的最佳使用习惯,是在项目根目录下根据项目所需版本创建独立的虚拟环境(virtual environment)。
1. 指定基础 Python 版本创建虚拟环境
在 cmd 中进入你的项目目录,使用 py 命令指定版本并拉起内置的 venv 模块:
:: 进入项目目录
cd /d D:\Projects\MyLegacyApp
:: 使用 Python 3.8 创建名为 .venv38 的虚拟环境
py -3.8 -m venv .venv38
2. 激活虚拟环境并运行脚本
创建成功后,运行该环境目录下的激活脚本:
:: 执行激活脚本
call .venv38\Scripts\activate.bat
激活后,cmd 命令提示符前会出现 (.venv38) 标识。此时该命令行会话的环境变量已经被自动重定向,在这个窗口中直接运行 python 和 pip,就会自动锁定为当时所选的 Python 3.8 版本:
:: 此时无需任何参数,直接运行即为 3.8
python main.py
:: 安装依赖也会完全隔离在 .venv38 文件夹内部
pip install flask
常见排查与避坑要点
1. 为什么在 cmd 输入 python 会直接弹出微软应用商店(Microsoft Store)?
这是 Windows 10/11 的一个默认设定。当系统中未正确配置环境变量时,系统自带的“应用执行别名”会拦截 python.exe 命令并尝试引导你去商店下载。解决方法非常直接:
- 打开 Windows 设置 -> 应用 -> 高级应用设置(或直接搜索“应用执行别名”)。
- 在列表中找到“应用安装程序 (python.exe)”与“应用安装程序 (python3.exe)”,将它们的开关全部设为关闭。
2. 系统找不到 py 命令怎么办?
如果你在 cmd 中执行 py 提示“不是内部或外部命令”,说明在安装 Python 时取消勾选了“py launcher”。不需要重新卸载 Python,只需重新打开任一版本的官方安装包(python-3.x.x-amd64.exe),点击 Modify(修改),勾选 py launcher 并保持 for all users,点击下一步即可快速补全安装。
3. 如何排查当前命令行的优先级?
如果想知道当前 cmd 会话中某个命令究竟指向哪里的物理文件,可以使用 Windows 内置的 where 命令排查:
where python
where pip
where py
命令输出的行顺序即为当前 cmd 的查找优先级(第一行就是当前敲击命令直接生效的程序)。
总结与使用场景决策建议
为了让大家在面对不同任务时快速选出最高效的方式,我们将几种指定版本运行脚本的方案综合对比如下:
| 方案 | 典型调用命令 | 优点 | 适用场景 |
|---|---|---|---|
| py 启动器(推荐) | py -3.8 script.py |
无需改 PATH、官方原生支持、支持 Shebang 与架构指定 | 日常开发、临时排查、多版本快速切换验证 |
| 绝对全路径 | "C:\...\python.exe" script.py |
零歧义、完全不受环境变量影响、确定性 100% | Windows 计划任务、后台自动化脚本、生产批处理 |
| 虚拟环境(venv) | call venv\Scripts\activate 接着 python script.py |
项目级彻底隔离,依赖库与 Python 解释器一体化 | 团队协作项目、依赖复杂的生产项目、长期维护工程 |
| 修改文件名(不推荐) | 改名为 python38.exe |
看似直观但会破坏 pip、构建工具和部分 C 扩展模块 | 不建议在任何场景下使用 |
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













