本文由博主翻译,译者评价:

软件开发者对工程环境、对开发工具的追求是不会止步的。随着开发要素的变迁,工具会不断演进、创新,来适应新的需求,解决面临的各类问题。开发者对新工具的挖掘/理解/采纳,也会反复循环。我们肯定得考虑切换工具的成本,但是也不能固步自封,因循守旧。这个就要自行评估和平衡了。

这篇文章中,对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:

  1. 操作系统预安装
  2. 使用brew 或者 apt 这样的包管理器
  3. 使用www.python.org上的二进制文件
  4. 使用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 –version

Python 3.6.6

$ pyenv local 3.7.0
$ python –version

Python 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 install

Creating 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文件非常重要,因为它做了两件事:

  1. 通过保持每个已安装包的哈希值来提供良好的安全性。
  2. 引入所有依赖项和子依赖项的版本,为你提供可复制的环境。

让我们看看它目前的样子:

{ "_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: promises a lot, delivers very little - Pipenv: 承诺的多,做到的少
Linux上的开发部署环境中Python多版本并存的方法