为什么 Python 会有.venv 虚拟环境的概念?

查看 302|回复 20
作者:bocchi1amos   
本人刚从 java 、c#转过来,因为工作需要,这两天开始研究 python 工程。
(其实以前也接触过,但只限于会写些代码层次的基础语法)
现在新人有个疑惑,为什么 python 会有.venv 这种概念,资料说是项目编译环境隔离,每个项目有自己的解释器环境什么的。其实这种给每个项目搞内环境部署,很像是 java 开发里给每种服务的 docker 容器都单独打包一个独立的 jdk ?

Python, venv, Java, 解释器

Juszoe   
Python 解释器的执行需要依赖环境(你导入的各种包),每个项目需要的环境不一样,为了避免冲突就隔离出来。而 Java 和 C#可以将环境编译到目标文件里,没有这种问题。同理 node.js 也有 node_package 。
codehz   
说白了就是早起项目设计的问题,一开始没做好依赖隔离的机制(全局安装包),只能后期不断打补丁解决。。。
Jat001   
python 不支持同一个库有多个版本同时存在,只能用虚拟环境隔离
cslive   
不能向下兼容,每个包需要的环境还不一样
visper   
因为 python 是很古老的语言,原来它只想安份地做一个 linux 下面的简单脚本语言。什么模块化包管理的工程问题不是它关心的问题。后来没法了。
cndenis   
如果你用 docker 容器打包 python 项目的话, 可以不用 venv 的
如果你用宿主机的 Python 运行多个项目的话, 每个项目要一个 venv 避免依赖包的版本冲突
Masoud2023   
你们 java 也有 classpath 这个概念啊,稍微现代点的语言配套的依赖管理哪个没有这种版本隔离设计?
你写 java 时候所有依赖都会扔进全局$CLASSPATH 吗?
无非只是 Python 处理 classpath 简单粗暴一点,按 java 的理解方式,直接创建一个新的 JAVA_HOME ,然后 java 复制一份进去,然后再把然后依赖扔进去。
本质都是为了去隔离依赖,只是 java 生态里( maven 、gradle 之类的)没这么简单粗暴而已。
如果你想知道为什么要隔离依赖,1 防止依赖冲突 2 方便部署,就是这么简单。
crackidz   
Java/C#对应的就是运行时版本问题
其实依赖包也算在运行时的一部分
bocchi1amos
OP
  
@cslive 意思是高版本的项目环境要导入某些包,但这些包一开始设计时采用的了低版本环境的,项目就会导包运行失败?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部