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

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


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

8292 次点击
所在节点    Python
69 条回复
julyclyde
2024-01-11 14:21:49 +08:00
导入路径和语言解释器所在的路径有关
所以只好把解释器拷贝很多份
KgM4gLtF0shViDH3
2024-01-11 14:25:57 +08:00
我还是更不理解为啥有的前端喜欢用 pnpm ,反过来学习古老的 python
cheng6563
2024-01-11 14:34:58 +08:00
因为 python 默认是所有项目共享第三方依赖的。pip install 会把库安装到操作系统里影响所有项目。
也就是 A 项目如果需求 depend:v1.1 ,B 项目就用不了 depend:v1.0
cdwyd
2024-01-11 14:43:15 +08:00
请按照 python 的习惯写 python
而不是写 python 语法的 java ,没必要就别过度封装,不要弄一堆服务,接口。
bocchi1amos
2024-01-11 14:58:19 +08:00
@cdwyd 你的回答是不是离题了。。
vituralfuture
2024-01-11 14:59:59 +08:00
@morgan1freeman JS 有运行时类型,任何一个变量的类型都可以通过 typeof 查看,只是 JS 在+,==这类运算符发现类型不匹配会自动尝试转换类型,这个是 ECMA script 规定的,现在看来属于是历史遗留问题了
frostming
2024-01-11 15:01:28 +08:00
就是一开始没设计好包隔离的问题,或者说当时没有这样的设计。导入路径(site-packages)完全由 python 解释器路径来计算,可以说是一个相当 naive 的方案。

后来有了这种需求,于是有人就想到可以虚拟化解释器,建立软链接,伪装成一个独立的 Python ,发现问题解决了!但其实这种方法相当 hacky 。大家习惯了反而没有什么动力去推动包导入机制的革新了,于是就这样用下来了。
frostming
2024-01-11 15:02:37 +08:00
pengtdyd
2024-01-11 15:07:03 +08:00
java 不是也有 maven 嘛
Davic1
2024-01-11 15:07:26 +08:00
@sjtulyj venv 给的不就是额外装的吗...
error451
2024-01-11 15:19:36 +08:00
你看看 venv 里面都配置了啥就明白了。 本质上 venv 就相当于一个傻瓜化的 本地 manve 仓库。 venv 实现的原理就是配置 PYTHONHOME 等 Python 运行时需要的环境变量来实现的。 这就和 java 常见的运行时 java -jar -classpath=xxx 是一个意思。 只不过 venv 傻瓜化操作, 一键就把这些配置都写成 bash 脚本,然后把包都移动到 venv 目录里的 lib 下面了而已。
如果你愿意的话, 这些操作你完全可以按照 java 的思路去手动配置。
est
2024-01-11 15:20:26 +08:00
python 没有 venv 概念。别被他们骗了

你把所有依赖复制到项目 lib 目录下,代码里 os.path.insert 一下就搞定了

哪里那么多废话。

如果别人要引用你的项目,把你的代码全部打成一个 zip 包丢给对方就行了 https://docs.python.org/3/library/zipimport.html

跟 jar 包甩来甩去一样方便!

别被他们骗了!!!
别被他们骗了!!!
别被他们骗了!!!
别被他们骗了!!!
别被他们骗了!!!
est
2024-01-11 15:23:02 +08:00
上面应该是 sys.path.insert 写错了~
morgan1freeman
2024-01-11 15:46:12 +08:00
@vituralfuture 但其实这不妨碍它设计这些东西的时候,是考量了给非专业人士用的原因,但是今天 javascript 实际上是给开发者用的,就像很多设计,像 win32 的拖拽窗口也是考量给 UI 非编程人士用的,但实际上都是开发人员在用
cdwyd
2024-01-11 15:56:26 +08:00
@vituralfuture 没有离题,因为我没写过 java ,就没有你的“为什么 python 会有 venv”的疑问,也就是说,不是 python 这种设计本身有问题,而是你习惯了其他语言的模式后,把其他语言的习惯带到 python 这边才会有此疑问。
lululau
2024-01-11 16:07:11 +08:00
3 楼正解,就是 pip 不支持同一个库的不同版本同时存在,才搞出了 venv, pipx 的一大堆;

rvm 有 gemset 的概念,但是我们 Ruby 的项目也不用,因为 rubygem 可以允许在全局存在同一个库的不同版本
veightz
2024-01-11 18:55:21 +08:00
本质上全都是环境隔离的问题. 实现上看在哪一个做, 能做到什么维度.

不过全是对信任不友好..由于 go 的代码要写的繁琐, 而去用 Python, 结果折腾了半天...我还是重新用 go 写 mvp 了... 体力活交给了 AI ..
LFL976
2024-01-11 19:03:06 +08:00
最近刚好学 python ,涨见识了
ilucio
2024-01-11 19:14:52 +08:00
@est 以前 IOT 上部署 python 就是这么搞的
thinkershare
2024-01-11 19:20:30 +08:00
python 的包管理已经没救了。一路涌过来,发现没有任何一个包管理工具是靠谱,稳定的。conda 的依赖解析甚至是一个 NP-Hard 搜索问题,以后只会越来越慢。我现在都是 conda-lock 锁定所有版本,在不同操作系统上锁定一份,单最近发现 conda-lock 生成初始化锁定文件动辄都是几个小时。这个 python 的版本控制从在 python 推翻 2 的时候,就应该重置,现在这样,只会越来越难用。

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

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

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

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

© 2021 V2EX