windows 系统安装 python 的最好方式也许就是不安装

一、 核心问题

目前在windows机器上面安装python,去python官网下载下来的安装文件不是具体的某一个版本的python,而是一个叫做“python-manager-25.0.msix”东西 这个东西被称作为“python install manager” 并且后面这种方式安装python将成为windows系统安装python的主流方式,官网原文如下:

The Python install manager for Windows is our tool for installing and managing runtimes. The traditional executable installer will stop being released with Python 3.16 As well as the files below, the Python install manager can be installed using the Microsoft Store app. For most users, this is the recommended approach.

从上面这段描述来看 通过python install manager将成为日后的主流方案,但是当你通过这种方式来安装完python之后,你大概率会遇到两个问题:

  • pip 命令无法使用:虽然 python -V 正常,但输入 pip 报错。 原因:Python 安装目录下的 Scripts 文件夹没有添加到系统环境变量 Path 中。
  • 多版本切换困难 当你使用python -V 命令检查系统当前在用的python版本时默认会是当前最新的版本,怎么才能动态切换系统的python版本,变成一个需要亟待解决的问题。
  • py命令与python命令 当你在命令行中执行 python -V 和 py -V 时你会发现两个命令竟然输出的东西一模一样,那么这个py命令和python命令的关系又是怎样的呢?

本文将主要介绍这些问题的解决方案,并对关键问题进行说明。

二、 基础概念解析

1. python vs py 命令

  • python (工人):直接调用 python.exe。它依赖环境变量 PATH,谁排在前面就启动谁,不灵活,容易版本冲突。
  • py (工头):Windows 独有的 Python 启动器。它不依赖 PATH,而是扫描注册表。
  • py:自动启动最新版。
  • py -3.8:强制启动 3.8 版本。 结论:在 Windows 命令行里,可以用 py 全面替代 python。但是也仅限是windows环境

下面几个py命令需要做重点关注

# 列举当前安装了哪些版本的python,标记 * 符号的是当前正在使用的版本 py --list # 使用3.12版本的python运行指定脚本 py -V:3.13 xxx.py # 上面的这个命令可以简写为 py -3.13 xxx.py

可以发现py命令是严格区分版本的 ,并且截止目前py 还没有那种可以动态切换当前正在使用的python版本的命令,官方的想法应该是想让我们时刻都知道命令和版本之间的对应关系。

此外 当你使用 python install manager 安装python时 默认会把python安装到C:\Users\你的用户名\AppData\Local\Python下面,还会把下图中的 bin 文件夹自动添加到系统环境变量(当前用户的Path环境变量下面)中:

image.png

2. 怎么运行pip来安装依赖呢?

假定我现在需要使用 pip 来安装 uv ,现在则需要使用下面的命令:

py -m pip install uv

这比我们之前直接安装指定版本的python的时候需要额外增加一个前缀 py -m 这个 -m 参数的含义是告诉 Python 不要运行文件,而是去已安装的库里找叫 pip 的模块并运行它。

通过上面的命令安装uv之后你会发现两个问题:

  • 直接在终端使用uv 直接报错,提示找不到可运行文件

其实这个很好理解,使用上面的文件会直接把uv放到当前正在运行的python安装目录的Script目录下,这个目录还不在系统Path环境变量下,自然提示找不到。

image.png

这里额外说明下如果你使用下面的命令安装,则会把uv安装到指定版本的python安装目录的Script目录下

py -3.13 -m pip install uv

回到开始的问题 这时候运行uv提示找不到路径怎么办?

第一种方式自然是把这个路径给添加到环境变量里面,这种方案可行,但是并不推荐,下面介绍最适合windows系统安装uv命令的方案

3.安装uv的最佳方案

安装uv的最佳方案是通过下面的命令安装,而不要去使用pip来安装

# Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

通过这种方式安装uv之后,会自动添加环境变量,一行命令即可畅快使用uv来做依赖管理,以及虚拟环境创建。

总结:其实你可能不需要在windows电脑手动安装python

其实对于windows电脑,你可能只需要安装uv即可。只安装uv会有下面的几个好处

  • 系统零污染: 你的 控制面板 -> 卸载程序 列表里干干净净,没有那一堆 "Python 3.x", "Python Launcher" 之类的东西。
  • 版本自由: 你想用 Python 3.8?uv run --python 3.8。 想用 Python 3.13?uv run --python 3.13。 uv 会把这些版本都管理得井井有条,用完甚至可以一键清理。

唯一的改变就是你在powershell上面无法使用python命令 需要学会把 python main.py 改为 uv run main.py

Read more

C++之模版详解(进阶)

C++之模版详解(进阶)

目录 1. 非类型模板参数 2. 类模板的特化 2.1 函数模板特化 2.2 类模版特化 3. 模板的分离编译 1. 非类型模板参数 模版参数有两种,一种叫类型模版参数,一种叫做非类型模版参数。今天我们来讲讲非类型模版参数。 template <int N> 中的 int N 就是典型的非类型模板参数。这里的 int 是参数的类型,而 N 是参数名,它接收的是一个具体的常量值,而非像普通类型模板参数(如 template <typename T>)那样接收一个 “类型”。 两者核心区别就是: * 类型模板参数:传递 “类型”(如 T

By Ne0inhk
【问题反馈】JNI 开发:为什么 C++ 在 Debug 正常,Release 却返回 NaN?

【问题反馈】JNI 开发:为什么 C++ 在 Debug 正常,Release 却返回 NaN?

摘要: 在 Android NDK / JNI 开发中,经常会遇到这样一种“诡异”问题:Debug 模式下运行完全正常,而 Release 模式却出现 NaN、Infinity 甚至随机结果。 本文通过一次真实的 JNI 坐标转换案例,深入分析了该问题的根本原因——C++ 返回局部栈内存指针所导致的未定义行为(Undefined Behavior)。 【问题反馈】JNI 开发:为什么 C++ 在 Debug 正常,Release 却返回 NaN? 本文为以下问题的解决记录。由于问题较为典型,故梳理备忘。 https://github.com/eqgis/Sceneform-EQR/discussions/16 一、问题现象描述 1. 现象

By Ne0inhk
C++学习之旅【C++伸展树介绍以及红黑树的实现】

C++学习之旅【C++伸展树介绍以及红黑树的实现】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》 《C++知识内容》《Linux系统知识》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 引言:前篇文章,小编已经介绍了关于C++AVL树的实现!相信大家应该有所收获!接下来我将带领大家继续深入学习C++的相关内容!本篇文章着重介绍关于C++伸展树介绍以及红黑树的实现!伸展树与红黑树是两类极具代表性的BBST,且在工程实践中各有不可替代的价值:伸展树摒弃了"严格平衡”的执念,通过“伸展”操作将最近访问的节点移至根节点,利用“局部性原理”优化频繁访问的场景,实现均摊O(logn)的时间复杂度,适合缓存、热点数据查询等场景;红黑树则通过给节点着色并遵守严格的颜色规则,确保树的最长路径不超过最短路径的两倍,以 “弱平衡” 换稳定的最坏O(logn)性能,是C++ STL 中 std::map、std:

By Ne0inhk
个人整理的超全C++ 八股文(全是干货)

个人整理的超全C++ 八股文(全是干货)

目录 C++ 面向对象和面向过程 面向过程 面向对象 三大特性? C语言和C++的区别? C++编译过程 多态 是什么? 分类? 虚函数 是什么? 底层? 解决的问题? 构造函数不能设置为虚函数? 重载 重写 隐藏 引用 是什么? 好处 为什么不能初始化为空? 引用与指针的区别? 内存分区 堆和栈的区别? 指针常量和常量指针 NULL在C语言中是(void *)0在C++中是0? C++用nullptr代指空指针? 构造函数 是什么? 拷贝构造 调用时机 拷贝构造参数不是引用行吗? 深浅拷贝的区别? 析构函数 是什么? 内存分配和销毁用什么? new和malloc 区别? new delete malloc free?

By Ne0inhk