Pipenv 學習筆記


更新:我已經轉向 poetry 了,poetry 大法好!pipenv 寫十行代碼,lock 半小時。。。

===

個人筆記,胡言亂語。並不是什么教學向文章。。

前言

在學習了 Python、Java 后,會發現 Java 有很成熟的項目構建工具,以前是使用 xml 的 Maven,現在又出現了使用 groovy 的 Gradle,這樣的構建工具能夠自動處理項目的依賴。而學 Python 的時候,我們往往只會用 pip install,這樣安裝好的模塊是全局的,用得久了就發現各個項目的模塊雜揉到一起,很是混亂,也可能會導致各種奇怪的錯誤。

Java 和 Python 在依賴方面的一個重要區別(也是 Python 的問題)在於:

  1. Java 所有的依賴均由 classpath 提供,而且默認的路徑里只有預置的包,不存在安裝某個庫這樣的說法。常見的做法是每個項目都用一個單獨的 lib 文件夾保存該項目私有的依賴。而有了 Maven/Gradle 后,大量依賴的添加/刪除,分環境的依賴等,也變得很容易搞定。
  2. 而 Python 用 pip 安裝的包,全都在一個全局模塊庫里面,無法實現項目間的依賴隔離。而且各種模塊混在一起,又沒有好用的依賴處理工具,簡直讓人抓狂。
    • Python 現在在役的包管理工具有 distutils setuptools distribute distlib pip,讓人眼花繚亂。(好消息是這里面現在只需要setuptools 和 pip 就夠了)
    • 為了隔離項目之間的依賴,Python 的虛擬環境模塊也層出不窮,pyenv venv virtualenv virtualenvwrapper,我是一臉懵逼的。
    • 此外,很多 Python庫使用了 C/C++語言,即使 Python 只是一個小版本的更新,對應的庫也需要完全重新編譯一次,也就是說不同小版本的 Python 的依賴也不一定能兼容。。(也就是不滿足二進制兼容性,ABI 不穩定)
    • 現在是 Python 版本 2 與 3 的過渡階段,因此用戶可能希望使用能用一個工具來在兩個版本間靈活地切換,並分別管理它們的依賴。
    • 在 windows 下用 pip 安裝源碼包,還要先裝好編譯工具鏈,麻煩。(這時可以用 conda,它提供的包都是已編譯的,所以不需要額外安裝什么。但是 pipenv 和它不能混用,如果要用 conda,那就得放棄 pipenv 了)

總之,在包管理這方面,Python 有很多的坑。

因此當我無意中發現董偉明-使用pipenv管理你的項目,說到 pipenv 會是終極方案時,我差點就感動得熱淚盈眶了。
開始前還是先說一下,pipenv 是項目隔離的包管理工具,因此如果需要安裝到全局,(使用 Linux 時,可能就會有這種需求了)還是需要 setuptools/pip.

Pipenv

安裝

現在是2018年9月,最新的 Linux 發行版基本都自帶 Python3.6 和 Python2.7,如果你打算用 3.6 的話,直接運行下面命令的其中之一就行,它們都等價(只要你沒改過啥東西):

# 如果使用的是 linux 自帶的 python 的話,此安裝命令需要 root 權限。
# sudo apt-get install python3-pip     # 新手請先安裝 pip

pip3 install pipenv
python3.6 -m pip install pipenv
pip3.6 install pipenv

基本用法

其實建議直接看參考鏈接里的官方文檔,和 pipenv --help,感覺沒啥可說的hhh,help 已經很清晰了。

幾個需要注意的有:

  1. pipenv --rm:刪除虛擬環境。
    • 另外如果沒有運行 rm 命令就直接刪除了項目,那你大概就只能手動刪除 $HOME/.local/share/virtualenvs/<項目名稱> 這個文件夾了。
  2. pipenv lock -r > requirements.txt:生成生產環境的 requirements.txt。添加 --dev 則生成開發環境的 requirements-dev.txt,也就是pipenv lock -r --dev > requirements-dev.txt
  3. pipenv sync:安裝 Pipfile.lock 中指定的所有包。(適用於測試環境等,因為使用 pipenv install 會更新 Pipfile.lock,可能導致版本不一致)

注意

  • pipenv 不會讀取 pip 的配置文件 pip.conf。所以配置 pip 的國內的 pypi 源時,注意修改這個是無效的,這需要修改 Pipfile。
  • 最新版 pycharm 已經添加了 pipenv 支持,新建項目時,可在 project interpreter 一欄選擇使用 pipenv. (記得提前安裝好 pipenv)
  • 2018.07.09 吐槽:為啥 pipenv lock 那么慢,簡直讓人以為電腦卡死了。。
    看到 github 上也有一堆關於 lock 慢的 issue. 官方的回應是正在優化,如果實在覺得慢,而且環境不算復雜,可以省略 lock 這一步(pipenv install xxx --skip-lock )。

畫外

說起來,下至編程語言,上至操作系統,包管理系統/項目構建系統 帶來的痛苦也是由來已久。操作系統方面需要考慮如何干凈地卸載一個軟件、如何在保持兼容性的同時盡可能地使用最新的軟件,編程方面也需要保持依賴庫的干凈整潔、兼容性與時效性並存。等等這樣的問題,包管理工具還真是任重道遠啊。
pip 和 Linux 系統的包管理工具,感覺很類似。只有一個全局環境,各種包互相依賴。
於是 Python 有了 virtualenv,Linux 有了 Docker......

順便,前兩天翻 Python 官方文檔,發現又有人造了兩個輪子(詳見 https://packaging.python.org/tutorials/managing-dependencies/),這兩個輪子比 Pipenv 更強大,更像 Gradle/Maven —— 它們不僅僅能管理依賴,還能初始化項目結構、做測試、生成文檔等等。如果是做大一點的項目,可能用它們更好。不過好像都還不怎么成熟,先觀望觀望再說。

參考

pipenv筆記
pipenv docs
packaging-tool-recommendations


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM