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.txtpipenv 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 ...
随机推荐
- 基于PowerShell的Lync Server管理 使用C#
这里所说的Lync Server管理,指通过C#管理Lync账号的启用,禁用,开启账户的语音功能. Lync服务器安装后,会自动创建一个用于远程管理的应用程序,通过IIS查看,其应用程序名为: Lyn ...
- springmvc如何获取参数
请参考这篇文章, 写得比较全面. https://www.cnblogs.com/xiaoxi/p/5695783.html
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- Luogu [P2708] 硬币翻转
硬币翻转 题目详见:硬币翻转 这道题是一道简单的模拟(其实洛谷标签上说这道题是搜索???),我们只需要每一次从前往后找相同的硬币,直到找到不同的硬币n,然后将找到的前n-1个相同的硬币翻过来,每翻一次 ...
- 在maven项目中 配置代理对象远程调用crm
1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...
- HTML复选框checkbox默认样式修改
此方法可以将复选框的默认样式替换成任意样式.如图: 未选择: 选择时: 思路:将复选框隐藏,利用lebal元素的焦点传递特性,用lebal的样式替代复选框. 代码如下: <!DOCTYPE ht ...
- GIT 团队协作快速入门使用
GIT使用: 1.本地新建一个文件夹 git init 2.克隆远程仓库 git clone git@xxxxx.git 3.本地创建一个dev分支 (前提是服务器端已经创建好有 DEV 分支) gi ...
- 【转载】SQLServer中char、varchar、nchar、nvarchar的区别:
(1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度 ...
- mysql 索引的统计
查看一个库里面没有使用过的索引select object_type,object_schema,object_name,index_name,count_star,count_read,COUNT_F ...
- win10下安装mysql-5.7.23-winx64
Step1 官方下载地址 https://dev.mysql.com/downloads/mysql/ 选择手动下载版本 解压到自己指定的路径 上图中的my.ini及data文件夹在压缩包里是没有的, ...