python 项目整合套件 pipenv

也许过程有些煎熬,但真的,熬过去就好了。

  今天翻看了强哥的博客,发觉他 mark 了一个工具,pipenv,是requests作者 kennethreitz 的又一新作,直观这即将成为又一装逼利器,于是乎虎躯一震,赶紧翻翻介绍,官网,本地测试。

  python 部落的这篇文章比较能说明痛点,目前在Python语言中,没有类似于Bundler或Gemfiles的东西,所以通常情况下Python开发人员使用Virtualenv创建一个虚拟环境,再创建一个依赖包列表requirements.txt,然后使用 Pip 安装依赖项。这种方法一般都会正常工作,但有时它也会表现出一些怪异的行为,因此你必须手动安装或删除某些特定版本的包,并记得定期更新requirements.txt文件,以保持项目环境的一致。特别是当你想要在你的虚拟环境中安装Python包,但它不一定与项目本身相关联。 此外,一些项目有时会保留requirements.txt文件的两个版本——一个用于开发环境,一个用于生产环境,这可能会导致更多的复杂性。Kenneth Reitz的最新工具Pipenv可以用于简化Python项目中依赖项的管理。 它汇集了PipPipfileVirtualenv的功能,是一个强大的命令行工具。

根据作者自己的说法

Pipenv 是一个实验性项目,旨在将所有最好的 packaging 世界带到 Python 世界。它将 Pipfile,pip 和 virtualenv 整合到一个单一的工具。

功能特性:

  • 自动生成和检查文件的哈希值锁定的依赖
  • 自动更新 PIP
  • 自动在包卸载时移除包
  • 在安装包时自动为 Pipfile 添加包
  • 自动在标准位置创建一个 virtualenv
  • 如果 aPipfile.lock 不尊在自动生成一个
  • 如果 aPipfile 不存在自动生成一个
  • 通过寻找 aPipfile 自动查找工程主页,递归

开始

1、官网已经给了例子,简单说下安装

$ pip install pipenv

2、初始化项目目录

$ mkdir your_dir
$ pipenv install
Creating a Pipfile for this project...
Creating a virtualenv for this project...
New python executable in /Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa
No package provided, installing all dependencies.
Pipfile found at /Users/song/tmp/testpro/Pipfile. Considering this to be the project home.
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
⠸Locking [packages] dependencies...
Updated Pipfile.lock!
Installing dependencies from Pipfile.lock...


To activate this project's virtualenv, run the following:
$ pipenv shell

$ ll
total 16
-rw-r--r-- 1 song staff 68B Apr 10 16:01 Pipfile
-rw-r--r-- 1 song staff 355B Apr 10 16:01 Pipfile.lock

从提示上可以看到在这个目录下新建两个文件,并且还在家目录下用 virtualenv 新建了一个虚拟环境/Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa,这里终端是有色彩显示的,但是我这里显示的原因

2、进入虚拟环境

$ pipenv shell
Spawning environment shell (/bin/zsh).
source /Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa/bin/activate
song@mingming  ~/tmp/testpro  source /Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa/bin/activate
(testpro-jrC8Ehsa) song@mingming  ~/tmp/testpro

这里碰到一个问题,我这条命令执行,终端缺没有变化,找寻了一遍发觉没能找到原因,直接在 github 上问了下作者,发觉已经有人碰到过类似的问题了,这里贴下

除了用pew可以解决外,直接使用pipenv shell -c 进入虚拟环境

使用

1、首先看下项目下的这两个文件,这是纯净状态下的配置

# 查看当前项目目录
$ pipenv --where
Pipfile found at /Users/song/tmp/testpro/Pipfile. Considering this to be the project home.

# 查看虚拟环境目录
$ pipenv --venv
/Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa

文件的初始状态

$ cat Pipfile
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true


$ cat Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "cb65967bdf3a7372749ce6144be4ee63f412aeeac624342fda3a2b58b1c43c15"
},
"requires": {},
"sources": [
{
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {},
"develop": {}
}%

2、下面当项目里安装第三方模块

(testpro-jrC8Ehsa) song@mingming $ pip install requests

# 此时查看虚拟环境中的 lib 库,即/Users/song/.local/share/virtualenvs/testpro-jrC8Ehsa/lib/python2.7/site-packages/ 就能看到安装的包了

# 如果不想进入虚拟环境,但同时想往虚拟环境里执行命令的话,pipenv 也提供了对应的命令
$ pipenv run [command]
$ pipenv run pip install requests

3、查看Pipfile的变化

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[packages]
requests = "*"

4、紧接锁定当前包的版本

$ pipenv lock
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock!

可以看到 Pipfile.lock 的变化,产生了一个 hash 值

{
"default": {
"requests": {
"version": "==2.13.0",
"hash": "sha256:1a720e8862a41aa22e339373b526f508ef0c8988baf48b84d3fc891a8e237efb"
}
},
"develop": {},
"_meta": {
"sources": [
{
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
],
"requires": {},
"hash": {
"sha256": "da2810af0c3b5333e0de2fce9bea2a228812e2014e5f5fe3b1c533badc6c24e4"
}
}
}%

这个时候,如果换个目录,换个环境,如果将我现在这个环境的依赖全部带过去

$ cp project/Pipfile  /new_project/dir/
$ pipenv install

新的项目目录即可按照文件里包的版本全部将对应的依赖撞到新的环境中,达到迁移的目的

中间出过问题,可能和我用的环境 zsh 有关,作者也说这是个实验性项目,不可避免的问题,不过看起来还是非常赞的,期待这个项目变得越来越好,如果有项目上,再继续更新

  

参考阅读