Pipenv 学习笔记
更新:我已经转向 poetry 了,poetry 大法好!pipenv 写十行代码,lock 半小时。。。
===
个人笔记,胡言乱语。并不是什么教学向文章。。
前言
在学习了 Python、Java 后,会发现 Java 有很成熟的项目构建工具,以前是使用 xml 的 Maven,现在又出现了使用 groovy 的 Gradle,这样的构建工具能够自动处理项目的依赖。而学 Python 的时候,我们往往只会用 pip install
,这样安装好的模块是全局的,用得久了就发现各个项目的模块杂揉到一起,很是混乱,也可能会导致各种奇怪的错误。
Java 和 Python 在依赖方面的一个重要区别(也是 Python 的问题)在于:
- Java 所有的依赖均由 classpath 提供,而且默认的路径里只有预置的包,不存在安装某个库这样的说法。常见的做法是每个项目都用一个单独的 lib 文件夹保存该项目私有的依赖。而有了 Maven/Gradle 后,大量依赖的添加/删除,分环境的依赖等,也变得很容易搞定。
- 而 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 已经很清晰了。
几个需要注意的有:
pipenv --rm
:删除虚拟环境。- 另外如果没有运行
rm
命令就直接删除了项目,那你大概就只能手动删除$HOME/.local/share/virtualenvs/<项目名称>
这个文件夹了。
- 另外如果没有运行
pipenv lock -r > requirements.txt
:生成生产环境的requirements.txt
。添加--dev
则生成开发环境的requirements-dev.txt
,也就是pipenv lock -r --dev > requirements-dev.txt
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 学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- thinkphp分页+条件查询
最近项目上面有一个带条件查询的分页列表,一开始form用的post,点击第二页就没有跳转成功,原因是分页是get请求,post数据链接到其他页面就会被清除. 解决办法: 1.form表单method= ...
- Hybris UI的Route(路由)实现
登录Hybris前台,在product catalog里选择Digital camera: 点击某个产品进入明细页面: 注意产品明细这个url: 这个明细页面的路由和SAP UI5的路由思路很像. 在 ...
- HBuilder发行App(Android和ios)
怎样将开发好的app测试和上架,此文包括Android和ios打包.测试和上架的大概过程.内容有些简陋,因为此过程踏坑无数,特此留念. 特此声明:内容不全仅供参考. 介绍两个参考网站: 1. http ...
- OpenLayers学习笔记2——坐标转换问题
参照别人的添加marker的demo来改造时,发现无论怎样更改经纬度,都是停留在同一个位置.过了一两天突然想起可能是坐标参考的问题,尝试搜了一下,果然是这个问题.问题是这样子的: WMTS中地图的坐标 ...
- JS let和const关键字
ES2015 引入了两个重要的 JavaScript 新关键词:let 和 const. Let关键字 1.用于作用域:块作用域,循环作用域,函数作用域,全局作用域, 在 ES2015 之前,Java ...
- java web用户登录界面
做这次实验,主要用到了mysql java web 的 内容 实验代码: IUserDao.java package com.jaovo.msg.dao; import java.util.List ...
- FTP、SFTP与FTPS
先简单介绍下FTP的基础知识 FTP的传输有两种方式:ASCII.二进制. FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式). 主动模式 FTP ...
- 【jenkins】jenkins服务器与svn服务器时间不一致出现的问题
问题描述: svn提交了一次更新包,到了jenkins提交更新的时候,第一次代码没有生效,然后重新提交了一次,第二次才生效. 问题排查: 1.首先第一反应比对了下两次更新的包文件是否一致,然后发现大小 ...
- CMDB(资产管理系统) day1
运维自动化最重要的就是标准化一切 自动化运维则支持以下功能: 1.OS的选择统一化,同一个项目使用同样的OS系统部署其所需要的各类软件.2.软件安装标准化,例如JAVA虚拟机,php,nginx,my ...
- Union found
Use array. class UnionFound { public: vector<int> v; int cnt; UnionFound(int n) { v = vector&l ...