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
這個問題初看起來不是問題,但是隨著你安裝程序的增多就知道有多麼痛苦了。
- 有的依賴庫依賴別的庫你怎麼解決?比如 pandas 需要安裝 numpy
- 有的依賴庫依賴 c 庫怎麼辦?比如 LXML
- 在 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 上回答過了
https://github.com/pypa/pipenv/issues/598
我剛開始覺得不提交會好一些,後來覺得 track 一下也無妨。
寫在最後
在用 npm 和 yarn 的時候,我有這麼一個想法,希望 python 圈子裡面能出一個類似於包管理工具。今年 2 月份的時候把自己的項目遷移過來,發現 pipenv 用起來很挺舒服的。
pipenv 是未來。火速用上吧。
覺得有趣就點個贊或者關注下唄。
推薦閱讀:
※大數據解密之你的同學從哪來又去了哪
※大家都在用 Node.js 幹什麼呢?
※漫談C指針(1):指針背後的邏輯
※編程的思考其二
※Python自編寫help文檔以及文檔測試