
只是把 virtualenv 和 pip 结合成一个命令让使用更加方便?
区分开发与生产依赖?写两个不同的 requirements.txt 也可以区分啊。
那么 Pipenv 到底解决了 Python 包管理中的什么痛点?能否举个具体场景的栗子
下面一位 Pipenv 维护者的回复让我了解到了一件事,虽然 node 社区里大家都吐槽 npm 的依赖目录树设计导致了 node_modules 目录过深多大的问题,但是 npm 的这个设计解决了多个包依赖同一个包的不同版本的问题。而这是目前 Python 的包管理尚未做到的事
。
1 66450146 2018-06-08 17:45:25 +08:00 库版本更新啊,不搞一个单独的 .lock 文件更新一次依赖要掉一层皮 |
2 jennifertxwoodma 2018-06-08 17:49:11 +08:00 解决了不会敲 pip freeze >> requirements.txt 的人的痛点, 充分说明了技术界还是要会吹 |
3 fy 解决了 locking 太慢,python 程序员不能像大型 C/CPP 项目以等待构建为借口摸鱼的问题。 |
4 est 2018-06-08 18:00:05 +08:00 解决了 NIH 症状。 |
5 kunluanbudang 2018-06-08 18:07:38 +08:00 via Android 使用了一段时间,粉转黑了 |
6 simpleapples 2018-06-08 18:15:01 +08:00 说一个平时时常用到的 pipenv shell 比 source venv/bin/activate 要方便很多 |
7 tonghuashuai 2018-06-08 18:25:07 +08:00 你的服务器上部署着三个 web 服务,第一个服务是你的前同事写的,需要 tornado 4.0.3,第二个服务是你写额,需要 tornado 4.3.0,第三个服务是你的另外一个同事写的,需要 tornado 5.0,只有一台服务器的情况下,就可以用 virtualenv 了 |
8 twor 2018-06-08 18:29:19 +08:00 @tonghuashuai virtualenv 不就是在同一台服务器解决这个问题的吗 |
9 doubleflower 2018-06-08 19:02:15 +08:00 @simpleapples 一个 alias 就解决的事用不着一个软件吧 |
10 chroming 2018-06-08 20:04:37 +08:00 方便且稳定就是进步了 |
11 0bit 2018-06-08 22:26:18 +08:00 就是 Python 的 npm |
12 uranusjr 2018-06-08 22:35:35 +08:00 基於完整揭露原:我是 Pipenv 三位目前的主要者,同其部份依。Pipenv PyPA 有格,也不者成有任何束,因此以下是我人的,法代表 Python 官方意。然而,我我的看法 Python 核心社群的普遍共一致。「 Pipenv 解什」容易人落入,因 Pipenv 本上包含了不直接相的部份:Pipfile ,以及 Virtualenv 操作。Pipenv 在部份都解有方案的,但是必分看,才能正它。 Pipfile 的目是取代在常使用的 requirements.txt 格式,引入 lock file 概念(或者叫做 shrinkwrap )。和 pip freeze 最大的差是,lock file 是一理上的依,而 pip freeze 是生上的依。你使用 pip freeze ,只是已安的套件「倒」出。你 locking 行,是直接取用套件的 metadata,直接建立套件的依果。在理上是有副作用的行(然上套件在期有什副作用是完全未知的,有法),所以只要依本身有改(例如有更新),每次 locking 的行完全相同。在依解析上是重要的特性,有趣的人可以自行研究,不述。 上面的法可能你 Pipfile 的步在於一更好的依解析格式行,但其不是如此。它提供的是依解析件事情「本身」因概念在 pip 中根本不存在。考以下的:你的案使用了套件 A 套件,它依於套件 B 的 2.x 系列。你的 requirements.txt 可能: A==1.0 B==2.5.1 在你想要作新功能,而加入套件 C,而它依 B 套件 3.0 的 API。在使用 pip 的下,你 pip install C。由於 pip 本身有依解析功能,它只知道要安 C,以及其依 B 3.0,於是你的 freeze 果成: A==1.0 B==3.0.0 C==1.0 候 A 很可能法使用,而你也已失去了前一,必重新建立你的境。但是更可能的是,如果你有完整的制,不定完全不件事情,直到有人抱怨。 另一方面,由於 Pipfile 有立的解析步,且不需要先套件安至境中,你 C 加入 Pipfile ,locking 就直接告知你依法被解析,防止後面的所有。且由於它只有在解析成功,才行安,你只要把 C Pipfile 移除,即可回到原本的案。 基於同的理由,Pipfile 同也有一些其他好。如果你有平台的依,例如 Windows 使用 X 套件,在 Mac 使用 Y,然後一抽象之的需求,pip freeze 基本法理。Pipfile 因不需要把套件本身到境中,就可以理。 在 Pipfile 之前,也有其他似功用的案,只是有提出全新的格式,而是沿用 requirements.txt 。piptools 是一比有名的例。不 Pipfile 的 TOML 格式 lock file 的 JSON 格式比起基於行的文字 requirements.txt 更有表能力,能理更泛的使用情境。 回到 Pipenv,在境的使用上,它的新度就有 Pipfile 格式那高,只是一 virtualenv 的,唯一比值得一提的,只有 run shell 指令。Shell 前面有人已提到,比起 activate 要方便一些,因後者是直接修改你有的 shell 境,而 shell 是直接一 shell 子程序,所以跑起更乾,也不容易出。不年 terminal emulator 街跑,也有很多其他 workaround 做法,shell 充其量就是推的 best practice 更多人知道。Run 也是差不多,其就是自你 active-行指令-deactivate。非常方便,但有特解什。 如果你 Pipenv 解了什,我而言,Pipfile 格式它提供的 locking 才是重,境管理我自己一也不什力(我加入 Pipenv 之前就,在是有自己),其什。但是 Pipenv 使用者而言,每天用到的都是境的介面,套件管理根本用不到次,更注意到它的技差,所以看它的境指令,得好像可有可也是合情合理,我者也都很清楚,所以我最近(大是今年 PyCon US 起,到在大一月)努力的方向,就是可能把 Pipenv 的各件拆分成立的套件,鼓大家根些套件建自己的工具,些技能正地被。 Pipenv 的初始作者是 Kenneth Reitz,我想大家都很清楚。Kenneth 最突出的技能,是一工作流程流、用、完整的介面,如果你有密切注他往的案,例如 Requests Records,能很明察。然而在流介面,有候就免不了牲技上的粹性:Requests 的 json() 函式 Records 的 Pandas 整合都是十分明的例子。在案中,HTTP SQL 基本都是用相成熟的用,所以大家也比能些功能的,以及函式的定位,但套件管理在 Python 社群,甚至整程式社群中,就不是那普遍的知,因此你把很多技混在一起,大家就很最成果。有令人憾,不也是我接下最重要的努力目。希望的解能大家更理解套件管理依解析,而能理解,甚至助建立 Pipenv 的正定位。 |
15 laike9m 2018-06-08 23:25:15 +08:00 @uranusjr 怎么看 Poetry 作者指出的 pipenv 解析依赖可能不成功的问题 ? https://github.com/sdispater/poetry#what-about-pipenv |
16 ifoolish OP @uranusjr #12 感谢你的耐心回复。而且终于见到了个具体的例子。但是如你所说的例子,即 Pipfile.lock 还是无法解决 A 和 C 依赖 B 的不同版本的问题吗?只是检测到依赖冲突后做出提示并阻止安装而已? |
17 uranusjr 2018-06-08 23:43:24 +08:00 |
18 uranusjr 2018-06-08 23:47:19 +08:00 @ifoolish 以 Python 目前的就是法解了,只能阻止安。核心者有提出一些方案,不有明,作上也不容易。如果有相知,尤其於不同依版本有解法的工具(如 Bundler NPM )者,迎到 Python 的 SIG mailing lists ,我很需要知的助。 |
19 dcoder 2018-10-22 15:38:03 +08:00 @uranusjr @ifoolish 我就问个最简单粗暴的问题, 在大多数时候, pipenv 到底能不能完美地复制一个开发环境? 比如我用 Mac 在本地做完了开发, 想 deploy 到 AWS, 用 Pipfile.lock 就能完美复制本地环境, 保证无错地在 AWS 的 Linux server 上跑起来么? 哪种情况下会出错, 是 pipenv 用户需要避免的? 另外, 假设我每次在本地 Mac 更新开发配置, 有没有 reliable 的流程 push 更新到我 AWS server 上? 如果可以的话,就可以用 pipenv 来做自动部署了. 有没有人这么做? 一定程度代替 docker? 从 pipenv 官网上看, 其设计思路是, 要查看被依赖包的 hash 的, 类似 Nix ( https://nixos.org/nix/) 所以它解决的问题,应该是可靠地 produce deterministic builds 环境. |