Pipenv 学习笔记

更新:我已经转向 poetry 了,poetry 大法好!pipenv 写十行代码,lock 半小时。。。

===

个人笔记,胡言乱语。并不是什么教学向文章。。

前言

在学习了 Python、Java 后,会发现 Java 有很成熟的项目构建工具,以前是使用 xml 的 Maven,现在又出现了使用 groovy 的 Gradle,这样的构建工具能够自动处理项目的依赖。而学 Python 的时候,我们往往只会用 pip install,这样安装好的模块是全局的,用得久了就发现各个项目的模块杂揉到一起,很是混乱,也可能会导致各种奇怪的错误。

Java 和 Python 在依赖方面的一个重要区别(也是 Python 的问题)在于:

  1. Java 所有的依赖均由 classpath 提供,而且默认的路径里只有预置的包,不存在安装某个库这样的说法。常见的做法是每个项目都用一个单独的 lib 文件夹保存该项目私有的依赖。而有了 Maven/Gradle 后,大量依赖的添加/删除,分环境的依赖等,也变得很容易搞定。
  2. 而 Python 用 pip 安装的包,全都在一个全局模块库里面,无法实现项目间的依赖隔离。而且各种模块混在一起,又没有好用的依赖处理工具,简直让人抓狂。
    • Python 现在在役的包管理工具有 distutils setuptools distribute distlib pip,让人眼花缭乱。(好消息是这里面现在只需要setuptools 和 pip 就够了)
    • 为了隔离项目之间的依赖,Python 的虚拟环境模块也层出不穷,pyenv venv virtualenv virtualenvwrapper,我是一脸懵逼的。
    • 此外,很多 Python库使用了 C/C++语言,即使 Python 只是一个小版本的更新,对应的库也需要完全重新编译一次,也就是说不同小版本的 Python 的依赖也不一定能兼容。。(也就是不满足二进制兼容性,ABI 不稳定)
    • 现在是 Python 版本 2 与 3 的过渡阶段,因此用户可能希望使用能用一个工具来在两个版本间灵活地切换,并分别管理它们的依赖。
    • 在 windows 下用 pip 安装源码包,还要先装好编译工具链,麻烦。(这时可以用 conda,它提供的包都是已编译的,所以不需要额外安装什么。但是 pipenv 和它不能混用,如果要用 conda,那就得放弃 pipenv 了)

总之,在包管理这方面,Python 有很多的坑。

因此当我无意中发现董伟明-使用pipenv管理你的项目,说到 pipenv 会是终极方案时,我差点就感动得热泪盈眶了。
开始前还是先说一下,pipenv 是项目隔离的包管理工具,因此如果需要安装到全局,(使用 Linux 时,可能就会有这种需求了)还是需要 setuptools/pip.

Pipenv

安装

现在是2018年9月,最新的 Linux 发行版基本都自带 Python3.6 和 Python2.7,如果你打算用 3.6 的话,直接运行下面命令的其中之一就行,它们都等价(只要你没改过啥东西):

# 如果使用的是 linux 自带的 python 的话,此安装命令需要 root 权限。
# sudo apt-get install python3-pip     # 新手请先安装 pip

pip3 install pipenv
python3.6 -m pip install pipenv
pip3.6 install pipenv

基本用法

其实建议直接看参考链接里的官方文档,和 pipenv --help,感觉没啥可说的hhh,help 已经很清晰了。

几个需要注意的有:

  1. pipenv --rm:删除虚拟环境。
    • 另外如果没有运行 rm 命令就直接删除了项目,那你大概就只能手动删除 $HOME/.local/share/virtualenvs/<项目名称> 这个文件夹了。
  2. pipenv lock -r > requirements.txt:生成生产环境的 requirements.txt。添加 --dev 则生成开发环境的 requirements-dev.txt,也就是pipenv lock -r --dev > requirements-dev.txt
  3. pipenv sync:安装 Pipfile.lock 中指定的所有包。(适用于测试环境等,因为使用 pipenv install 会更新 Pipfile.lock,可能导致版本不一致)

注意

  • pipenv 不会读取 pip 的配置文件 pip.conf。所以配置 pip 的国内的 pypi 源时,注意修改这个是无效的,这需要修改 Pipfile。
  • 最新版 pycharm 已经添加了 pipenv 支持,新建项目时,可在 project interpreter 一栏选择使用 pipenv. (记得提前安装好 pipenv)
  • 2018.07.09 吐槽:为啥 pipenv lock 那么慢,简直让人以为电脑卡死了。。
    看到 github 上也有一堆关于 lock 慢的 issue. 官方的回应是正在优化,如果实在觉得慢,而且环境不算复杂,可以省略 lock 这一步(pipenv install xxx --skip-lock )。

画外

说起来,下至编程语言,上至操作系统,包管理系统/项目构建系统 带来的痛苦也是由来已久。操作系统方面需要考虑如何干净地卸载一个软件、如何在保持兼容性的同时尽可能地使用最新的软件,编程方面也需要保持依赖库的干净整洁、兼容性与时效性并存。等等这样的问题,包管理工具还真是任重道远啊。
pip 和 Linux 系统的包管理工具,感觉很类似。只有一个全局环境,各种包互相依赖。
于是 Python 有了 virtualenv,Linux 有了 Docker......

顺便,前两天翻 Python 官方文档,发现又有人造了两个轮子(详见 https://packaging.python.org/tutorials/managing-dependencies/),这两个轮子比 Pipenv 更强大,更像 Gradle/Maven —— 它们不仅仅能管理依赖,还能初始化项目结构、做测试、生成文档等等。如果是做大一点的项目,可能用它们更好。不过好像都还不怎么成熟,先观望观望再说。

参考

pipenv笔记
pipenv docs
packaging-tool-recommendations

posted @ 2018-04-28 17:40  於清樂  阅读(3769)  评论(0编辑  收藏  举报