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

2024-01-10 22:20:41 +08:00
 bocchi1amos


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

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

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

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

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

如果你想知道为什么要隔离依赖,1 防止依赖冲突 2 方便部署,就是这么简单。
crackidz
2024-01-11 10:08:26 +08:00
Java/C#对应的就是运行时版本问题

其实依赖包也算在运行时的一部分
bocchi1amos
2024-01-11 10:13:50 +08:00
@cslive 意思是高版本的项目环境要导入某些包,但这些包一开始设计时采用的了低版本环境的,项目就会导包运行失败?
yinmin
2024-01-11 10:22:49 +08:00
python 很多包不同版本不兼容,又无法同时安装用一个包的多个版本。如果 1 台机器运行多个 python 程序,1 个程序用了高版本的包,另外 1 个程序用了低版本的包,那么这 2 个程序就无法同时使用,为了解决类似问题,需要使用 venv
bocchi1amos
2024-01-11 10:29:45 +08:00
@cslive 也没有类似 maven 隔离的工具吗?
bocchi1amos
2024-01-11 10:31:19 +08:00
@yinmin python 是否有类似 maven 这类自动构建依赖隔离的工具?
lonewolfakela
2024-01-11 10:45:12 +08:00
@bocchi1amos #12 venv 就是你要的隔离工具呀,只不过具体实现方案和 maven 差别有些大就是了
aapeli
2024-01-11 10:58:46 +08:00
python 不需要编译构建,python 因此没有构建工具,依赖隔离的工具可以看 miniconda
Maerd
2024-01-11 11:05:25 +08:00
venv 实际上就可以理解成 node 的 node_modules
xiaowowo
2024-01-11 11:29:20 +08:00
可以了解一下 poetry https://python-poetry.org/
kneo
2024-01-11 12:08:11 +08:00
你搞 java 难道没用过 pom.xml ?一个意思。只不过 Python 没出息,抄的 node_modules 那一套。虽然不咋地,比没有强点。
sjtulyj
2024-01-11 12:20:35 +08:00
用 venv 有个好处, 不用额外装 pip
venv 会给你一个 pip
morgan1freeman
2024-01-11 12:28:41 +08:00
别问 问就是历史原因,type hints 还导致循环依赖呢,python3 设计的时候就没考虑过这些,它跟 javascript 一样 设计就是一门简单的语言,奈何后面胶水 胶的太好了,javascript 甚至更绝,动态类型 1 "1" 都不用区别了,python 好歹还是强类型的动态语言, javascript "666"/2 都能正常运行
morgan1freeman
2024-01-11 12:39:18 +08:00
还有,用啥就学啥吧,用那个技术领域成熟的约定跟方案吧,别自己想那么多,我自己搞过 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