更新:我已经转向 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. SAP云平台CloudFoundry中的用户自定义变量

    CloudFoundry应用的manifest.xml里的env区域,允许用户自定义变量,如下图5个变量所示. 使用cf push部署到CloudFoundry之后,在SAP Cloud Platfo ...

  2. 123apps-免费网络应用

    前言 在Jianrry`s博客看见推荐这个网址,试用了一下感觉还不错.主要是完全免费!!就当备用吧 网站介绍 123apps 网站地址:https://123apps.com/cn/ 旗下网站: PD ...

  3. python_62_装饰器5

    import time def timer(func): #timer(test1) func=test1 def deco(*args,**kwargs): start_time=time.time ...

  4. 使用VSCode搭建TypeScript开发环境 (重点)

    下载TypeScript 在CMD(Windows系统)或者终端(macOS系统)中输入一下命令: npm install -g typescript 下载VSCode VSCode是我使用过最棒的编 ...

  5. perl 输出当前时间

    #!/bin/perluse POSIX;print strftime("%Y-%m-%d %H:%M:%S", localtime);

  6. java字符格式

    http://blog.chinaunix.net/uid-12348673-id-3335300.html http://blog.csdn.net/zhouyong80/article/detai ...

  7. display:inline-block解决文字有间隙问题

    定义:display:inline-block是使元素以块级元素的形式呈现在行内.意思就是说,让这个元素显示在同一行不换行,但是又可以控制高度和宽度,这相当于内联元素的增强. 但是display:in ...

  8. Servlet 的生命周期 及 注意事项 总结

    Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...

  9. React报错 :browserHistory doesn't exist in react-router

    由于版本问题,React中history不可用 import { hashHistory } from 'react-router' 首先应该导入react-router-dom包: import { ...

  10. GVIM——简直美如画,有没有!

    "========================================== " Author: wklken " Version: 9.1 " Em ...