本文由博主翻译,译者评价:
软件开发者对工程环境、对开发工具的追求是不会止步的。随着开发要素的变迁,工具会不断演进、创新,来适应新的需求,解决面临的各类问题。开发者对新工具的挖掘/理解/采纳,也会反复循环。我们肯定得考虑切换工具的成本,但是也不能固步自封,因循守旧。这个就要自行评估和平衡了。
这篇文章中,对Python项目的控制管理分成两个部分:Python解释器交给pyenv,项目中使用的Python包交给Pipenv。确实是一个很不错的选择。
2019-10-09 更新:
由于众所周知的网络原因,联网下载Python很慢很慢,可以采用如下办法:
wget http://mirrors.sohu.com/python/3.6.9/Python-3.6.9.tar.xz -P ~/.pyenv/cache/
export PYENV_ROOT=$HOME/.pyenv
pyenv install 3.6.9
这是一种个人强烈推荐的在本地使用Python进行开发的的办法。你可能已经发现了,不同项目有着不同Python版本的依赖项,针对管理这些项目是很麻烦的。
更为复杂的是,有多种方法可以安装Python:
- 操作系统预安装
- 使用brew 或者 apt 这样的包管理器
- 使用www.python.org上的二进制文件
- 使用pyenv-easy方法安装和管理Python安装过程?
本指南使用pyenv来管理Python安装,使用Pipenv来管理项目依赖项(而不是原始pip)。
安装pyenv
让我们通过brew安装:
$ brew install pyenv
如果你不在Mac上,请参阅pyenv的安装说明。
将以下内容添加到〜/ .bash_profile或〜/ .bashrc(取决于你的shell)以在终端加载时自动初始化pyenv:
eval “$(pyenv init -)”
译者注:pyenv有个自动安装器,更简单易用,看博主上一篇文章。
pyenv如何工作?
查看所有可用的Python版本:
$ pyenv install –list
让我们安装Python 3.6.6
$ pyenv install 3.6.6
Installed Python-3.6.6 to /Users/dvf/.pyenv/versions/3.6.6
pyenv不会更改你的全局解释器,除非你告诉它:
$ python –version
Python 2.7.14
$ pyenv global 3.6.6
Python 3.6.6
pyenv允许你将不同版本的python本地安装到一个目录中。让我们创建一个针对python 3.7.0的项目:
$ pyenv install 3.7.0
Installed Python-3.7.0 to /Users/dvf/.pyenv/versions/3.7.0$ mkdir my_project && cd my_project
$ python –versionPython 3.6.6
$ pyenv local 3.7.0
$ python –versionPython 3.7.0
现在,只要你发现自己在my_project中,你就会自动使用Python 3.7.0解释器。
搞明白没有?如果没有,停在这里并花一些时间来捣鼓pyenv-它的工作原理是在〜/ .pyenv中安装所有Python解释器,并根据你当前的目录动态调整你的$ PATH。
Pipenv是什么?它是如何运作的?
Pipenv是官方推荐的管理项目依赖关系的方式。 与在项目中拥有requirements.txt文件和管理virtualenv不同,现在你的项目中有一个Pipfile文件,可以自动完成所有这些工作。
首先通过pip安装它,这是一个快速发展的项目,因此请确保你拥有最新版本(撰写本文时为2018.10.13):
pip install -U pipenv
首次使用 Pipenv
让我们在你的项目中设置Pipenv:
$ cd my_project
$ pipenv installCreating a virtualenv for this project…
Pipfile: /Users/dvf/my_project/Pipfile
Using /Users/dvf/.pyenv/versions/3.7.0/bin/python3.7 (3.7.0) to create virtualenv…
你将在项目中找到两个新文件:Pipfile和Pipfile.lock。
如果你在现存的项目中安装,Pipenv会将你的旧requirements.txt转换为Pip文件。 够酷吧?
对于新项目,PipFile应该是这样的:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”
[packages]
[dev-packages]
[requires]
python_version = “3.7”
请注意,我们这里没有激活任何虚拟环境,Pipenv为我们处理虚拟环境。 因此,安装新的依赖项很简单:
$ pipenv install django
Installing django
…
Installing collected packages: pytz, django
Successfully installed django-2.1.2 pytz-2018.5
Adding django to Pipfile’s [packages]…
Pipfile.lock (4f9dd2) out of date, updating to (a65489)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (4f9dd2)!
Installing dependencies from Pipfile.lock (4f9dd2)…
? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 2/2 — 00:00:01
To activate this project’s virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
如果你检查Pipfile,你会发现它现在包含django =“*”作为依赖项。
如果我们想在开发期间安装dev依赖项以供使用,例如YAPF,则需要在安装步骤中添加–dev:
$ pipenv install –dev yapf
什么是Pipfile.lock文件?
Pipfile.lock文件非常重要,因为它做了两件事:
- 通过保持每个已安装包的哈希值来提供良好的安全性。
- 引入所有依赖项和子依赖项的版本,为你提供可复制的环境。
让我们看看它目前的样子:
{ "_meta": { "hash": { "sha256": "627ef89...64f9dd2" }, "pipfile-spec": 6, "requires": { "python_version": "3.7" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "django": { "hashes": [ "sha256:acdcc1...ab5bb3", "sha256:efbcad...d16b45" ], "index": "pypi", "version": "==2.1.2" }, "pytz": { "hashes": [ "sha256:a061aa...669053", "sha256:ffb9ef...2bf277" ], "version": "==2018.5" } }, "develop": {}}
请注意,每个依赖项的版本都是固定的。如果没有很好的理由,你肯定总是希望将此文件提交给你的源代码管理系统。
自定义索引
在Pipenv出现之前,我们一直很难使用私有的Python仓库。例如,你想在组织内托管私有Python仓库。 现在你需要做的就是将它们定义为Pipfile中的附加源:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”[[source]]
url = “https://www.example.com”
verify_ssl = true
name = “some-repo-name”[packages]
django = “*”
my-private-app = {version=”*”, index=”some-repo-name”}[dev-packages]
[requires]
python_version = “3.7”
请注意,我们告诉my-private-app使用私有仓库。 如果省略,Pipenv将遍历索引,直到找到包。
?Pipenv还将使用值中的任何环境变量,如果你有不想放在源代码管理系统中的敏感凭据(这是我的贡献</ humblebrag>),这将是非常有用的。
部署时,如果安装的依赖项与Pipfile.lock不匹配,则知道部署失败非常重要。 所以你应该在你的安装步骤中添加–deploy,如同这样:
$ pipenv install –deploy
你还可以检查哪些依赖项不匹配:
$ pipenv check
并查看这些包安装了哪些子依赖项:
$ pipenv graph –reverse
pip==18.1
pytz==2018.5
– Django==2.1.2 [requires: pytz]
setuptools==40.4.3
wheel==0.32.2
yapf==0.24.0
一次性命令,脚本和激活虚拟环境
如果你正在积极开发一个项目,则激活虚拟环境会很有帮助:
$ pipenv shell
Launching subshell in virtual environment…
(my_project) ➜ my_project
或者,如果你想在虚拟环境中执行命令:
$ pipenv run python manage.py runserver
你还可以向pipfile添加类似于npm package.json的脚本:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”
[packages]
django = “*”
[dev-packages]
yapf = “*”
[scripts]
server = “python manage.py runserver”
[requires]
python_version = “3.7”
现在你可以执行脚本:
$ pipenv run server
我们刚刚触及冰山一角。 如果你想了解有关Pipenv的更多信息,我建议你阅读其优秀的文档。
本文翻译自:Why you should use pyenv + Pipenv for your Python projects
转载使用请保留本文链接。
pipenv目前还有比较严重的bug - lock过程巨慢,跟挂了差不多,等修复吧,受不了。