更新:我已经转向 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

Pipenv 学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. cms-最近更新

    在这一讲中有几个很重要的地方需要注意: 1.在查询帖子的时候需要把帖子类型id带到帖子类型表中把类型查询出来 2.在字帖子查询语句中用limt限制查询那个阶段的帖子 3.在界面显示的时候需要用到字符串 ...

  2. 剑指offer:按之字形顺序打印二叉树(Python)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 先给定一个二叉树的样式: 前段时间 ...

  3. edge不能上网-代码 INET_E_RESOURCE_NOT_FOUND

    这个问题 ,网上有很多解决方法,我基本都测试了一遍,可是我都没有用 情况:首先,我开始的时候是可以用的,然后在公司,开了代理,就不能使用了,这是我之后多次尝试发现的,所以你也遇到和我一样的情况不必惊慌 ...

  4. Python小脚本程序

    本文旨在搜集最简单最原子性的代码块,简单清晰容易阅读,然后由用户自己组合.Python代码排版请自行修改. 这里是索引目录: 1. 下载网站文件 2. 下载网站多个文件 1. 下载网站文件 impor ...

  5. 操作系统(5)_内存管理_李善平ppt

    i386先通过段是管理,在通过页是管理

  6. Java - BigDecimal四舍五入注意事项

    如上图,精度后只有一位时,是五舍六入.     如上图,精度后只有第一位不为0时,也是五舍六入.     如上图,精度后至少有两位不为0时,才是四舍五入.  

  7. Linux监控二之cacti简单安装部署

    目录 cacti简单部署    1 环境依赖包部署    1 1.    cacti中文版0.8e搭建    2 2.    cacti安装向导 url:http://192.168.200.243/ ...

  8. Shell脚本使用汇总整理——达梦数据库备份脚本

    Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...

  9. Javascript 模块化指北

    前言 随着 Web 技术的蓬勃发展和依赖的基础设施日益完善,前端领域逐渐从浏览器扩展至服务端(Node.js),桌面端(PC.Android.iOS),乃至于物联网设备(IoT),其中 JavaScr ...

  10. Nodejs NPM CNPM优雅安装install

    由于npm和cnpm都能安装组件,安装的组件有的保存在c盘用户目录的Appdata隐藏目录下,有的保存在安装node的目录下,而且安装在c盘的话,重装系统又得重新部署,甚是麻烦,所以这里提供优雅安装的 ...