译者评价:

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

这篇文章中,对Python项目的控制管理分成两个部分:Python解释器交给pyenv,项目中使用的Python包交给Pipenv。确实是一个很不错的选择。

enter image description here

这是一种个人强烈推荐的在本地使用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 –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文件非常重要,因为它做了两件事:

通过保持每个已安装包的哈希值来提供良好的安全性。 引入所有依赖项和子依赖项的版本,为你提供可复制的环境。 让我们看看它目前的样子:

{

"_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的更多信息,我建议你阅读其优秀的文档。

译者博客