PyCon 2018 之 Python 未來的依賴管理工具 pipenv

PyCon 2018 之 Python 未來的依賴管理工具 pipenv

來自專欄 MG的編程小屋

0x00 前言

PyCon 2018 有很多精彩的演講,今天的文章里,介紹一下 K 神的演講 『Python 未來的包管理工具 pipenv』

Kenneth Reitz 出品,必屬精品。

Python packaging 進化歷史

剛開始的時候,我們是這樣安裝包的。

curl http://pypi.python.org/packages/alsdasdl/requests.tar.gz | tar zxfcd requests/python setup.py install

這個問題初看起來不是問題,但是隨著你安裝程序的增多就知道有多麼痛苦了。

  1. 有的依賴庫依賴別的庫你怎麼解決?比如 pandas 需要安裝 numpy
  2. 有的依賴庫依賴 c 庫怎麼辦?比如 LXML
  3. 在 python2.6.5 下,如果我需要安裝兩個不同版本的 Django 開發不同的軟體怎麼辦?難道只能動態複製文件到 site-packages 裡面?

後來,我們是這樣安裝包的。

easy_install requests

我們可以直接從 pypi 進行安裝了。但尼瑪,為什麼 easy_install 安裝很 easy, 但是沒有 easy_uninstall?

好,2010 年後,我們繼續前進:

  • 可以通過 pip 替代 easy_install 了。
  • 可以通過 virtualenv 管理項目的依賴庫了。雖然說,還是不能像 ruby gem 一樣同時把多個版本的的軟體裝在同一個系統里。
  • 可以通過 requirements 鎖依賴了。

但,同期的其他編程語言社區分別出現了如下的包管理工具:

  • node -> yarn && npm , 有 lockfile
  • php -> composer , 有 lockfile
  • rust -> cargo , 有 lockfile
  • ruby -> bundler , 有 lockfile

而我大 Python 居然沒跟上潮流

  • python -> pip && virtualenv/venv , 無 lockfile

PS: Python3.3 之後,默認可以直接使用 venv 模塊,不需要再安裝 virtualenv 了。但還是需要手動,並且用起來比較反直覺。

關於 requirements.txt

  • 如果你使用 pip freeze 來形成這個文件,則不直觀,完全看不出來哪個依賴庫依賴哪個依賴。
  • 如果你直接手動指定你所需要的庫,比如 flask 的話,似乎又有些太直觀了。

如果能有一個東西,既可以表示 freeze 的結果 (what you want),又可以表示你需要的庫 (what you need). 就好了。

這當然可以考慮用兩份 requirements 來解決。先安裝 what you need 用來開發,然後 freeze 為 what you want 去部署。

當然,鋪墊了這麼多 K 神肯定是來介紹他的 pipenv 的。

比如說,我想查看,本項目的依賴庫,直接 pipenv graph

coverage==4.5.1fabric==2.0.1 - cryptography [required: >=1.1, installed: 2.2.2] - asn1crypto [required: >=0.21.0, installed: 0.24.0] - cffi [required: >=1.7, installed: 1.11.5] - pycparser [required: Any, installed: 2.18] - idna [required: >=2.1, installed: 2.6] - six [required: >=1.4.1, installed: 1.11.0] - invoke [required: <2.0,>=1.0, installed: 1.0.0] - paramiko [required: >=2.4, installed: 2.4.1] - bcrypt [required: >=3.1.3, installed: 3.1.4] - cffi [required: >=1.1, installed: 1.11.5] - pycparser [required: Any, installed: 2.18] - six [required: >=1.4.1, installed: 1.11.0] - cryptography [required: >=1.5, installed: 2.2.2] - asn1crypto [required: >=0.21.0, installed: 0.24.0] - cffi [required: >=1.7, installed: 1.11.5] - pycparser [required: Any, installed: 2.18] - idna [required: >=2.1, installed: 2.6] - six [required: >=1.4.1, installed: 1.11.0] - pyasn1 [required: >=0.1.7, installed: 0.4.2] - pynacl [required: >=1.0.1, installed: 1.2.1] - cffi [required: >=1.4.1, installed: 1.11.5] - pycparser [required: Any, installed: 2.18] - six [required: Any, installed: 1.11.0]flake8==3.5.0 - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1] - pycodestyle [required: <2.4.0,>=2.0.0, installed: 2.3.1] - pyflakes [required: >=1.5.0,<1.7.0, installed: 1.6.0]# 其他省略

如何嘗鮮?我最近更新到了之前寫的一個庫(代碼寫的慘不忍賭,最近準備重構,勿噴)

git clone git@github.com:twocucao/YaPyLib.gitcd YaPyLib/brew install pipenvpipenv --threepipenv install --devpipenv shell

記住幾個命令

pipenv --venv # 查看 venv 位置pipenv --python 3.6.5exit 退出 pipenv shell

至於其他的功能,參考官網自己摸索吧。

FAQ 環節

FAQ 環節有一個問題非常有趣,應該把 lockfile 放在 git 倉庫裡面嗎?

k 神是這麼回答的 yes。 這個問題很久之前就在 issue 上回答過了

github.com/pypa/pipenv/

我剛開始覺得不提交會好一些,後來覺得 track 一下也無妨。

寫在最後

在用 npm 和 yarn 的時候,我有這麼一個想法,希望 python 圈子裡面能出一個類似於包管理工具。今年 2 月份的時候把自己的項目遷移過來,發現 pipenv 用起來很挺舒服的。

pipenv 是未來。火速用上吧。

覺得有趣就點個贊或者關注下唄。

推薦閱讀:

大數據解密之你的同學從哪來又去了哪
大家都在用 Node.js 幹什麼呢?
漫談C指針(1):指針背後的邏輯
編程的思考其二
Python自編寫help文檔以及文檔測試

TAG:Python | 編程 | Django框架 |