快速配置python的項目環境

1. 引例

在我們開發python項目的時候,常常需要在本機開發完之後部署到一個全新的環境中去。在這個過程中,一個重要的問題就是如何快速的將開發環境中依賴的包也部署到新環境中,特別是當新環境無法聯網的時候。有很多方法可以爲遷移部署工作提供幫助。其實利用python的pip模塊就可以做到這一點,其官方的使用教程在[這],本文稍作搬運。

2. pip的使用

2.1 pip是什麼

pip實際上是一個python包的管理工具,安裝完成之後,就可以在命令行調用pip的相關命令來管理python包,例如,最常用的pip install <pkg>pip list等。

2.2 pip的使用

如果你的項目是在一個單獨的虛擬環境中開發的話,那麼利用pip可以非常容易進行項目環境的遷移部署。

首先,我們需要獲取到安裝在當前環境下的所有的第三方包,利用pip非常容易做到:

pip freeze > requirements.txt

命令也非常好理解,就是將當前環境下的第三方包進行freeze,然後將結果寫入到requirements.txt文件中去。如果你注意觀察的話,很多作者發佈的第三方包裏都會帶有一個這樣的文本文檔,其生成方式就是這樣的。

至此,如果你的新環境可以聯網,那麼你需要做的就是在新環境下安裝好python,然後將requirements.txt文件拷貝到新環境中,執行:

pip install -r requirements.txt

2.3 安裝*.whl文件

很多情況下,新環境是沒辦法連接互聯網的,這個時候,就需要將安裝文件拷貝到新環境中進行離線安裝了。如果安裝的包不是很多,可以從pypi上下載源碼,解壓後運行命令安裝。下面介紹安裝*.whl文件的方式。

關於介紹*.whl文件的文章有很多,我們可以把它看成是一種特殊的壓縮文件,而且利用pip命令可以直接進行安裝:pip install somepkg.whl

要想安裝whl文件,首先要製作whl文件。啓動項目的虛擬環境後,使用以下命令可以批量製作whl文件:

 pip wheel --wheel-dir=/tmp/wheelhouse -r requirements.txt

根據requirements.txt生成的whl文件全部放在/tmp/wheelhouse目錄下了,這時候只需要將目錄打包上傳到新環境中,然後運行:

pip install --no-index --find-links=/tmp/wheelhouse -r requirements.txt

這樣,就完成了批量依賴包的安裝。

注意:必須保證在製作和安裝whl文件時python的版本與操作系統分別一致。

3. conda的使用

conda是一個開源的包與環境管理工具,在第2部分中的利用pip freeze命令所做的事情,conda也有對應的命令:

conda list --export

另外,conda也包含了一系列的命令來遷移一個開發環境,可以參看它的幫助文檔,理解了pip的工作方法之後,應該不會有什麼困難。

4. pipreqs的使用

在第2部分,我們可以使用pip freeze > requirements.txt來獲取所有的依賴包。但這裏存在幾個問題問題:

問題來自官方文檔,我對第一個問題表示懷疑。

  1. 上述命令只能將用pip安裝的包進行freeze,用其他方式——例如conda——安裝的包可能會無法freeze;
  2. 上述命令會freeze環境中的所有依賴包,除非爲每一個項目單獨建立了虛擬環境,否則得到的requirements.txt中會有許多非指定項目必需的依賴包。

這個時候,可以嘗試使用pipreqs命令。pipreqs也是python的第三方包,其項目主頁在,可以使用pip install pipreqs進行安裝。

安裝完成後,可以在命令行進行使用:

pipreqs <path>

<path>指定目錄,那麼pipreqs將會在指定的目錄進行查找,並獲取所有的第三方包及版本,並生成requirements.txt文件。

可能的問題:

  • pipreqs只能生成項目的直接依賴包,無法獲取依賴包的依賴,即如果項目直接依賴numpy,生成的requirements.txt中並不包含numpy的依賴包;
  • 如果在使用的過程中出現UnicodeDecodeError,可以嘗試使用--encoding命令,指定編碼格式,如pipreqs --encoding=utf-8 ./

5. 其他

  • 爲每個項目創建一個單獨的虛擬環境是一個非常好的習慣;
  • 目前我還沒有發現一種可以獲取指定項目依賴的包及其依賴的開源工具,如果讀者有好的資源,歡迎分享;
  • 學會用docker真得可以事半功倍。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章