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

120 天前
 bocchi1amos


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

6526 次点击
所在节点    Python
68 条回复
Juszoe
120 天前
Python 解释器的执行需要依赖环境(你导入的各种包),每个项目需要的环境不一样,为了避免冲突就隔离出来。而 Java 和 C#可以将环境编译到目标文件里,没有这种问题。同理 node.js 也有 node_package 。
codehz
120 天前
说白了就是早起项目设计的问题,一开始没做好依赖隔离的机制(全局安装包),只能后期不断打补丁解决。。。
Jat001
119 天前
python 不支持同一个库有多个版本同时存在,只能用虚拟环境隔离
cslive
119 天前
不能向下兼容,每个包需要的环境还不一样
visper
119 天前
因为 python 是很古老的语言,原来它只想安份地做一个 linux 下面的简单脚本语言。什么模块化包管理的工程问题不是它关心的问题。后来没法了。
cndenis
119 天前
如果你用 docker 容器打包 python 项目的话, 可以不用 venv 的
如果你用宿主机的 Python 运行多个项目的话, 每个项目要一个 venv 避免依赖包的版本冲突
Masoud2023
119 天前
你们 java 也有 classpath 这个概念啊,稍微现代点的语言配套的依赖管理哪个没有这种版本隔离设计?

你写 java 时候所有依赖都会扔进全局$CLASSPATH 吗?

无非只是 Python 处理 classpath 简单粗暴一点,按 java 的理解方式,直接创建一个新的 JAVA_HOME ,然后 java 复制一份进去,然后再把然后依赖扔进去。

本质都是为了去隔离依赖,只是 java 生态里( maven 、gradle 之类的)没这么简单粗暴而已。

如果你想知道为什么要隔离依赖,1 防止依赖冲突 2 方便部署,就是这么简单。
crackidz
119 天前
Java/C#对应的就是运行时版本问题

其实依赖包也算在运行时的一部分
bocchi1amos
119 天前
@cslive 意思是高版本的项目环境要导入某些包,但这些包一开始设计时采用的了低版本环境的,项目就会导包运行失败?
yinmin
119 天前
python 很多包不同版本不兼容,又无法同时安装用一个包的多个版本。如果 1 台机器运行多个 python 程序,1 个程序用了高版本的包,另外 1 个程序用了低版本的包,那么这 2 个程序就无法同时使用,为了解决类似问题,需要使用 venv
bocchi1amos
119 天前
@cslive 也没有类似 maven 隔离的工具吗?
bocchi1amos
119 天前
@yinmin python 是否有类似 maven 这类自动构建依赖隔离的工具?
lonewolfakela
119 天前
@bocchi1amos #12 venv 就是你要的隔离工具呀,只不过具体实现方案和 maven 差别有些大就是了
aapeli
119 天前
python 不需要编译构建,python 因此没有构建工具,依赖隔离的工具可以看 miniconda
Maerd
119 天前
venv 实际上就可以理解成 node 的 node_modules
xiaowowo
119 天前
可以了解一下 poetry https://python-poetry.org/
kneo
119 天前
你搞 java 难道没用过 pom.xml ?一个意思。只不过 Python 没出息,抄的 node_modules 那一套。虽然不咋地,比没有强点。
sjtulyj
119 天前
用 venv 有个好处, 不用额外装 pip
venv 会给你一个 pip
morgan1freeman
119 天前
别问 问就是历史原因,type hints 还导致循环依赖呢,python3 设计的时候就没考虑过这些,它跟 javascript 一样 设计就是一门简单的语言,奈何后面胶水 胶的太好了,javascript 甚至更绝,动态类型 1 "1" 都不用区别了,python 好歹还是强类型的动态语言, javascript "666"/2 都能正常运行
morgan1freeman
119 天前
还有,用啥就学啥吧,用那个技术领域成熟的约定跟方案吧,别自己想那么多,我自己搞过 go rust javascrip typescript java grovy jetbrains ide 插件开发,哪个具体的领域都有自己构建方案 跟构建风格,以及语言哲学,说白了 这些都是社区各自的喜好,maven 也不是绝对的,当你仲裁依赖冲突的时候就知道了,明明编译通过的代码,结果运行的时候,自动仲裁可能用了老版本,新的代码用了 未实现的方法,贼鸡儿恶心

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1007645

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX