为什么你应该在项目中使用pyenv+Pipenv:为你的Python项目设置超棒的本地开发工作流之秘籍

栏目: Python · 发布时间: 5年前

内容简介:本文由博主翻译,译者评价:软件开发者对工程环境、对开发工具的追求是不会止步的。随着开发要素的变迁,工具会不断演进、创新,来适应新的需求,解决面临的各类问题。开发者对新工具的挖掘/理解/采纳,也会反复循环。我们肯定得考虑切换工具的成本,但是也不能固步自封,因循守旧。这个就要自行评估和平衡了。这篇文章中,对Python项目的控制管理分成两个部分:Python解释器交给pyenv,项目中使用的Python包交给Pipenv。确实是一个很不错的选择。

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

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

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

这是一种个人强烈推荐的在本地使用Python进行开发的的办法。你可能已经发现了,不同项目有着不同Python版本的依赖项,针对管理这些项目是很麻烦的。

为什么你应该在项目中使用pyenv+Pipenv:为你的Python项目设置超棒的本地开发工作流之秘籍

更为复杂的是,有多种方法可以安装Python:

  1. 操作系统预安装
  2. 使用brew 或者 apt 这样的包管理器
  3. 使用www.python.org上的二进制文件
  4. 使用pyenv-easy方法安装和管理Python安装过程:sunglasses:

本指南使用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)… :snake: ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 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": "<a class="markup--anchor markup--pre-anchor" href="https://pypi.org/simple" target="_blank" rel="nofollow noopener" data-href="https://pypi.org/simple">https://pypi.org/simple</a>",
                "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将遍历索引,直到找到包。

:bulb: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Systems

Distributed Systems

Sukumar Ghosh / Chapman and Hall/CRC / 2014-7-14 / USD 119.95

Distributed Systems: An Algorithmic Approach, Second Edition provides a balanced and straightforward treatment of the underlying theory and practical applications of distributed computing. As in the p......一起来看看 《Distributed Systems》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器