venv和pyenv在mac上
是的,理论上你可以用 venv
选择 Python 版本,但有一个关键前提:系统中必须已安装该版本的 Python 解释器。venv
本身并不提供 Python 版本管理功能,它只是基于现有的 Python 环境创建虚拟隔离空间。以下分场景详细说明:
1. 直接使用 venv
选择 Python 版本的方法
前提条件
- 你的 Mac 上已经安装了多个 Python 版本(例如通过 Homebrew、官方安装包或 pyenv 安装)。
- 知道不同 Python 解释器的具体路径。
操作步骤
-
查看已安装的 Python 路径
在终端执行以下命令,查看系统可用的 Python 版本路径:ls /usr/local/bin/python* # 通过 Homebrew 安装的 Python 通常在此路径 ls /usr/bin/python* # 系统自带的 Python(通常为 2.7 或旧版 3.x)
-
指定 Python 解释器创建虚拟环境
使用-p
参数指定 Python 解释器的绝对路径:# 示例:使用 Python 3.11 创建虚拟环境 python3.11 -m venv my_project # 直接调用 python3.11(需已安装)
2. venv
的局限性
问题:无法直接安装新 Python 版本
- 场景:若你的系统只有 Python 3.9,但项目需要 Python 3.12,仅用
venv
无法解决,必须通过其他工具(如 pyenv、Homebrew 或手动安装)先安装 Python 3.12。
原生 venv
的依赖关系
工具/方法 | 功能 | 是否需要预装 Python 版本 |
---|---|---|
venv | 创建虚拟环境 | 是 |
pyenv | 安装并切换 Python 版本 | 否(可自动下载安装) |
Homebrew | 安装 Python 和其他系统工具 | 否 |
3. 推荐方案:配合 pyenv 实现灵活版本管理
为什么需要 pyenv?
- 一键安装多版本 Python:无需手动下载或编译。
- 动态切换版本:全局或按目录指定 Python 版本。
- 与
venv
无缝协作:先选版本,再创建虚拟环境。
操作步骤
-
安装 pyenv(通过 Homebrew):
brew update brew install pyenv
-
安装所需 Python 版本:
pyenv install 3.12.0 # 安装 Python 3.12.0
-
创建虚拟环境:
pyenv local 3.12.0 # 在当前目录下指定 Python 3.12.0 python -m venv my_env # 使用 3.12.0 创建虚拟环境 source my_env/bin/activate
4. 对比不同方法的复杂度
方法 | 步骤 | 适用场景 |
---|---|---|
纯 venv | 1. 手动安装多版本 Python 2. 用绝对路径创建环境 | 已有多个 Python 版本的简单项目 |
venv + pyenv | 1. 用 pyenv 安装 Python 2. 指定版本创建环境 | 需要灵活切换版本的长期项目 |
venv + Homebrew | 1. 用 Homebrew 安装 Python 2. 通过版本别名(如 python3.11 )创建 | 依赖 Homebrew 生态的用户 |
5. 验证 Python 版本
在虚拟环境中执行以下命令,确认版本正确:
python --version # 应显示你指定的版本(如 Python 3.12.0)
总结
- 能用
venv
选 Python 版本吗?:可以,但必须提前安装目标版本。 - 更高效的方法:推荐结合
pyenv
或Homebrew
安装和管理多版本 Python,再用venv
隔离项目环境。 - 原生
venv
的不足:无法解决“安装新版本 Python”这一核心需求,需借助其他工具。
若你希望保持工具链简洁,可参考以下命令流:
# 安装 pyenv 和 Python 3.12
brew install pyenv
pyenv install 3.12.0# 创建并激活虚拟环境
pyenv local 3.12.0
python -m venv my_project
source my_project/bin/activate
相关文章:
venv和pyenv在mac上
是的,理论上你可以用 venv 选择 Python 版本,但有一个关键前提:系统中必须已安装该版本的 Python 解释器。venv 本身并不提供 Python 版本管理功能,它只是基于现有的 Python 环境创建虚拟隔离空间。以下分场景详细说明:…...

OpenCv实战笔记(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64开发环境
一. 准备工作 Visual Studio 2019(安装时勾选 C 桌面开发 和 Windows 10 SDK) CMake 3.20(官网下载) Qt 5.15.2(下载 Qt Online Installer)安装时勾选 MSVC 2019 64-bit 组件。 opencv 4.11.1 源码下载 git…...
前端获取流式数据并输出
在一些实时对话、日志推送等场景下,如果使用传统一次性加载数据的方式,可能会出现等待时间较长的不友好交互,这个时候我们需要使用流式布局分段获取数据,渐进式加载,减少等待焦虑。 原生js上,我们使用fetch…...

全局网络:重构数字时代的连接范式
从局部到全局 —— 网络架构的范式革命 在全球化与数字化深度融合的今天,传统网络架构的 “碎片化” 问题日益凸显:跨地域数据流通低效、设备互联孤岛化、安全策略难以统一。 全局网络作为一种突破地域与技术边界的新型网络架构,正成为企业…...

C++ Primer (第五版)-第十四章重载运算与类型转换
文章目录 一、基本概念可以被重载某些运算符不应被重载尽量明智使用运算符重载赋值和复合赋值运算符选择作为成员或者非成员 输入和输出运算符输入运算符尽量减少格式化操作输入输出运算符必须是非成员函数 重载输入运算符>>输入时的错误标示错误 算数和关系运算符相等运…...
nt!MiSessionAddProcess函数分析和nt!MmSessionSpace全局变量的关系
第一部分: 1: kd> g Breakpoint 42 hit nt!MiSessionAddProcess: 80ab2fbe 55 push ebp 1: kd> kc # 00 nt!MiSessionAddProcess 01 nt!MmCreateProcessAddressSpace 02 nt!PspCreateProcess 03 nt!NtCreateProcessEx 04 nt!_KiSystemServic…...

鸿蒙开发——5.ArkUI @Builder装饰器:打造高效可复用的UI组件
鸿蒙开发——5.ArkUI Builder装饰器:打造高效可复用的UI组件 ArkUI Builder装饰器:打造高效可复用的UI组件一、Builder装饰器是什么?二、两种构建函数类型1. 私有自定义构建函数2. 全局自定义构建函数 三、参数传递核心规则1. 按值传递&#…...
bash和zsh的区别
Bash(Bourne-Again SHell)和 Zsh(Z Shell)都是 Unix/Linux 系统中的主流 Shell,但它们在功能、配置和用户体验上有显著区别。以下是两者的详细对比: 1. 历史与兼容性 特性BashZsh诞生时间1989 年ÿ…...

PyTorchVideo实战:从零开始构建高效视频分类模型
视频理解作为机器学习的核心领域,为动作识别、视频摘要和监控等应用提供了技术基础。本教程将详细介绍如何利用PyTorchVideo和PyTorch Lightning两个强大框架,构建基于Kinetics数据集训练的3D ResNet模型,实现高效的视频分类流程。 PyTorch…...
深入理解Spring缓存注解:@Cacheable与@CacheEvict
在现代应用程序开发中,缓存是提升系统性能的重要手段。Spring框架提供了一套简洁而强大的缓存抽象,其中Cacheable和CacheEvict是两个最常用的注解。本文将深入探讨这两个注解的工作原理、使用场景以及最佳实践。 1. Cacheable注解 基本概念 Cacheable…...
Rust 与 Golang 深度对决:从语法到应用场景的全方位解析
一、引言 在软件开发的快速发展浪潮中,Rust 和 Golang(Go 语言)脱颖而出,成为开发者热议的编程语言。Rust 凭借强大的内存安全性与卓越的性能备受赞誉,Golang 则以简洁的语法和出色的并发处理能力赢得开发者青睐。本文…...
java加强 -泛型
概念 定义类、接口、方法时,同时声明了一个或多个类型变量(如<E>),称为泛型类、泛型接口、泛型方法、它们统称为泛型。 语法 public class ArrayList<E>{} E可以接收不同类型的数据,可以是字符串&…...
pygame联网飞机大战游戏实现
客户端 import pygame import socket import json import threadingclass GameClient:def __init__(self):pygame.init()self.screen_width 600 # 宽度减小self.screen_height 800 # 高度增加self.screen pygame.display.set_mode((self.screen_width, self.screen_heigh…...

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(二)
8 行为规范 8.1 本章定义监督实体(Supervisor)与加工资源(Processing Resource)为实现物料加工所需的高层级通信逻辑,不涉及具体消息细节(详见第10章消息服务)。 8.2 加工任务通信 8.2.1 加工…...

根据窗口大小自动调整页面缩放比例,并保持居中显示
vue 项目 直接上代码 图片u1.png 是个背景图片 图片u2.png 是个遮罩 <template><div id"app"><div class"viewBox"><divclass"screen":style"{ transform: translate(-50%,-50%…...
如何在Jmeter中调用C程序?
在JMeter中调用C语言程序可以通过以下几种方式实现: 方法一:使用OS Process Sampler JMeter的“OS Process Sampler”可以用来调用外部程序,包括C语言编写的可执行文件。 步骤: 准备C语言程序: 编写C语言代码并编译…...

Android SDK 国内镜像及配置方法(2025最新,包好使!)
2025最新android sdk下载配置 1、首先你需要有android sdk manager2、 直接上教程修改hosts文件配置域名映射即可(不用FQ)2.1 获取ping dl.google.com域名ip地址2.2 配置hosts文件域名映射2.3 可以随意下载你需要的sdk3、 总结:走过弯路,踩过坑!!!大家就不要踩了!避坑1…...

【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现
🎵 【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情…...

OpenStack Yoga版安装笔记(26)实例元数据笔记
一、实例元数据概述 1.1 元数据 (官方文档:Metadata — nova 25.2.2.dev5 documentation) Nova 通过一种叫做元数据(metadata)的机制向其启动的实例提供配置信息。这些机制通常通过诸如 cloud-init 这样的初始化软件…...

【Linux】swap交换分区管理
目录 一、Swap 交换分区的功能 二、swap 交换分区的典型大小的设置 2.1 查看交换分区的大小 2.1.1 free 2.1.2 cat /proc/swaps 或 swapon -s 2.1.3 top 三、使用交换分区的整体流程 3.1 案例一 3.2 案例二 一、Swap 交换分区的功能 计算机运行一个程序首先会将外存&am…...
Spring IoC (Inversion of Control) 控制反转是什么?
我们分析一下 IoC (Inversion of Control) 控制反转的核心思想。 核心思想: IoC 是一种设计原则(Design Principle),它描述了一种软件设计模式,其中组件(对象)的创建、依赖关系的管理和生命周…...
互联网大厂Java求职面试:核心技术点深度解析
互联网大厂Java求职面试:核心技术点深度解析 在互联网大厂的Java岗位面试中,技术总监级别的面试官通常会从实际业务场景出发,层层深入地考察候选人的技术能力。本文通过一个严肃专业的技术总监与搞笑但有技术潜力的程序员郑薪苦之间的互动对…...

VirtualBox 创建虚拟机并安装 Ubuntu 系统详细指南
VirtualBox 创建虚拟机并安装 Ubuntu 系统详细指南 一、准备工作1. 下载 Ubuntu 镜像2. 安装 VirtualBox二、创建虚拟机1. 新建虚拟机2. 分配内存3. 创建虚拟硬盘三、配置虚拟机1. 加载 Ubuntu 镜像2. 调整处理器核心数(可选)3. 启用 3D 加速(图形优化)四、安装 Ubuntu 系统…...
【算法基础】递归算法 - JAVA
一、递归基础 1.1 什么是递归算法 递归算法是一种通过函数调用自身来解决问题的方法。简单来说,就是"自己调用自己"。递归将复杂问题分解为同类的更简单子问题,直到达到易于直接解决的基本情况。 1.2 递归的核心要素 递归算法由两个关键部…...

触想CX-3588工控主板应用于移动AI数字人,赋能新型智能交互
一、行业发展背景 随着AI智能、自主导航和透明屏显示等技术的不断进步,以及用户对“拟人化”、“沉浸式”交互体验的期待,一种新型交互终端——“移动AI数字人”正在加速实现规模化商用。 各大展厅展馆、零售导购、教学政务甚至家庭场景中,移…...

【深入浅出MySQL】之数据类型介绍
【深入浅出MySQL】之数据类型介绍 MySQL中常见的数据类型一览为什么需要如此多的数据类型数值类型BIT(M)类型INT类型TINYINT类型BIGINT类型浮点数类型float类型DECIMAL(M,D)类型区别总结 字符串类型CHAR类型VARCHAR(M)类型 日期和时间类型enum和set类型 …...

Vue3响应式:effect作用域
# Vue3响应式: effect作用域 什么是Vue3响应式? 是一款流行的JavaScript框架,它提供了响应式和组件化的视图组织方式。在Vue3中,响应式是一种让数据变化自动反映在视图上的机制。当数据发生变化时,与之相关的视图会自动更新。 作用…...

25.5.4数据结构|哈夫曼树 学习笔记
知识点前言 一、搞清楚概念 ●权:___________ ●带权路径长度:__________ WPL所有的叶子结点的权值*路径长度之和 ●前缀编码:____________ 二、构造哈夫曼树 n个带权值的结点,构造哈夫曼树算法: 1、转化成n棵树组成的…...

RabbitMQ 深度解析:从核心组件到复杂应用场景
一.RabbitMQ简单介绍 消息队列作为分布式系统中不可或缺的组件,承担着解耦系统组件、保障数据可靠传输、提高系统吞吐量等重要职责。在众多消息队列产品中,RabbitMQ 凭借其可靠性和丰富的特性,在企业级应用中获得了广泛应用。 二.RabbitMQ …...
Python高级技巧及案例分析:提升编程能力的实践指南
目录 Python高级技巧及案例分析:提升编程能力的实践指南1. Python高级特性概述2. 函数式编程技巧2.1 高阶函数2.2 函数柯里化2.3 不可变数据结构3. 元编程与反射3.1 动态属性访问3.2 类装饰器3.3 元类应用4. 并发与异步编程4.1 多线程与线程池4.2 协程与asyncio4.3 多进程处理…...