1. 程式人生 > 程式設計 >Python專案化安裝第三方模組的實現方案

Python專案化安裝第三方模組的實現方案

之前接觸的高階語言對於第三方模組的管理,基本都是專案化安裝,到了Python發現pip命令預設都是全域性安裝。

雖然平常開發和部署都使用Docker,避免了模組衝突、刪除等問題,但把第三方模組當全域性變數來處理的方式自然不能忍。

網上找了很久資料沒有發現靠譜的解決方案,於是從開始了探索。

解決方案

先來回顧一下使用第三方模組的過程,再來針對這些步驟進行必要的修改和調整。

  1. 使用pipy(Python Package Index)安裝第三方模組。
  2. 在專案程式碼中引用模組。
  3. 將依賴的包寫成配置檔案。

安裝

環境變數

要修改第三方模組安裝路徑,最容易找到的方法就是通過修改環境變數實現。

通過python -m site

命令可以打印出配置資訊。

顯示的預設安裝路徑是/usr/local/lib/python3.7/site-packages,支援通過修改USER_BASEUSER_SITE引數進行自定義安裝路徑。

但這顯然不是我們想要到,因為沒有解決根本問題!

只是把全域性安裝的路徑替換了而已,比較適用於解決磁碟空間不足的問題。

並沒實現專案化安裝,畢竟不可能每次安裝之前都改一下環境變數~

即使不怕麻煩如此操作,每個專案都修改環境變數的話,如果同時修改也會引起問題。

命令引數

所以我們需要換一種更友好的方式,比如看一看pip命令在安裝模組的時候是不是可以指定目錄。 pip install -h後在一大堆引數說明中發現有個-t

引數可以指定安裝目錄。

比如說希望將第三方模組flask安裝到專案根路徑的package目錄下,可以執行這樣一條命令:

pip install -t ./package flask

引用

由於改變了第三方模組安裝路徑,所以不能從預設的全域性路徑引用了,需要採用引用自定義包的方式。

Python的引用機制不像 Node.js 可以直接使用相對路徑,需要通過sys.path.append函式將包的根路徑新增到系統變數中。 然後才可以通過 import 引用了。

示例程式碼:

import os,sys
fullpath = os.path.abspath(__file__)
path = fullpath.replace('src/'
+ __name__.replace('__','')+'.py','') sys.path.append(path + 'package') from flask import Flask ... 複製程式碼

配置

預設的依賴匯出命令是pip freeze,但是這個命令很不友好,會列出所有全域性安裝的模組。

所以找到了替代方案pipreqs,它會自動遍歷程式碼,找到第三方模組引用並生成配置檔案,比較智慧,但是不知道在大型專案上會不會有效能問題。

使用時需要先通過pip install pipreqs安裝,然後在專案目錄下執行pipreqs ./,會自動生成requiements.txt檔案,如果檔案存在則需要新增--force引數來允許覆蓋。

不過有個需要注意的地方就是:如果引用的自定義模組與第三方模組重名,就會被pipreqs解析為第三方模組。

所以在命名自定義模組的時候儘量加上字首避免重名。

其它方案

寫完文章之後發現還有另一種實現方式,就是使用第三方工具virtualenvvirtualenvwrapper,基本原理就是臨時修改環境變數,有興趣的讀者可以試一試。


原文連結:tech.gtxlab.com/python-pack…

作者資訊:朱德龍,人和未來高階前端工程師。