為什麼你應該在專案中使用pyenv+Pipenv:為專案設定超棒的本地開發工作流之祕籍

威靈頓發表於2019-01-23

譯者評價:

軟體開發者對工程環境、對開發工具的追求是不會止步的。隨著開發要素的變遷,工具會不斷演進、創新,來適應新的需求,解決面臨的各類問題。開發者對新工具的挖掘/理解/採納,也會反覆迴圈。我們肯定得考慮切換工具的成本,但是也不能固步自封,因循守舊。這個就要自行評估和平衡了。

這篇文章中,對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的更多資訊,我建議你閱讀其優秀的文件。

譯者部落格

相關文章