为什么你应该在项目中使用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


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

查看所有标签

猜你喜欢:

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

服务设计与创新实践

服务设计与创新实践

宝莱恩 (Andy Polaine)、乐维亚 (Lavrans Lovlie)、里森 (Ben Reason) / 王国胜、张盈盈、付美平、赵芳 / 清华大学出版社 / 2015-6-1 / CNY 69.00

产品经济的时代渐行渐远,在以服务为主导的新经济时代,在强调体验和价值的互联网时代,如何才能做到提前想用户之所想?如何比用户想得更周到?如何设计可用、好用和体贴的服务?这些都可以从本书中找到答案。本书撷取以保险业为代表的金融服务、医疗服务、租车及其他种种服务案例,从概念到实践,有理有据地阐述了如何对服务进行重新设计?如何将用户体验和价值提前与产品设计融合在一起? 《服务设计与创新实践》适合产品......一起来看看 《服务设计与创新实践》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具