最近遇到了一個場景:需要將Python項目文件打包到無法聯網的主機上部署執行,本篇文章記錄針對於該場景的處理方案。
說明:
源主機(可聯網):安裝了Python3和pip3
目標主機(無法聯網):需安裝和源主機相同的Python版本和pip3,部署執行項目文件
主機系統為centos,Python版本為3.5.2,通過虛擬環境+pip進行遷移
目標主機離線安裝Python及pip3
源主機中下載所需包
Python3
首先,下載Python3,可以在官網或者通過源主機(可聯網的其它主機)wget:
wget --no-check-certificate https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
Python3依賴包
然后,需要下載Python3的依賴包,可以通過centos鏡像中去copy,不過我更推薦用yum生成的方式:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel epel-release gcc gcc-c++ xz-devel readline-devel gdbm-devel sqlite-devel tk-devel db4-devel libpcap-devel libffi-devel --downloadonly --downloaddir=/packages
命令執行完畢,你就會在/packages目錄下發現所需的所有.rpm文件。
如果,源主機中已經安裝了這些依賴,那么你可以用:
yum reinstall zlib-devel bzip2-devel openssl-devel ncurses-devel epel-release gcc gcc-c++ xz-devel readline-devel gdbm-devel sqlite-devel tk-devel db4-devel libpcap-devel libffi-devel --downloadonly --downloaddir=/packages
打包:
zip -r packages.zip packages/
目標主機中安裝
將Python-3.5.2.tgz和packages.zip上傳至目標主機。
首先,安裝Python3依賴:
unzip packages.zip
cd packages/
rpm -Uvh *.rpm --nodeps --force
然后,安裝Python3:
tar -zxvf Python-3.5.2.tgz
mkdir /usr/local/python3
cd Python-3.5.2
./configure --prefix=/usr/local/python3 # 將Python3安裝在/usr/local/python3
make && make install # 編譯安裝
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # 創建python3軟鏈接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 # 創建pip3軟鏈接
安裝完畢,可通過:
Python3 -V
pip3 -V
查看並檢查安裝的版本
源主機中打包項目文件
若項目中創建虛擬環境,首先激活虛環境,然后進入項目文件,執行:
pip3 freeze > requirements.txt
將當前項目中的庫列表生成並保存在requirements.txt中。
然后,通過pip生成批量離線安裝包(whl文件):
pip wheel --wheel-dir=./tmp/packages -r requirements.txt
執行完畢之后,你會發現/tmp/packages中包含了項目所需的所有.whl
打包項目文件:
zip A.zip A/
目標主機中部署
上傳A.zip至目標主機,創建虛環境,並激活(python3 自帶了venv):
python3 -m venv test_venv
cd test_venv
source bin/activate
解壓項目代碼A.zip,並切換:
unzip A.zip
cd A/
安裝項目Python依賴模塊:
pip3 install --no-index --find-links=tmp/packages -r requirements
安裝完畢,檢查:
pip3 freeze
當然你也可以通過python命令行import進行檢驗哈哈。
最后,執行項目啟動腳本(startup.sh)部署:
chmod +x ./startup.sh
nohup ./startup.sh > a-log 2>&1 &
以上,就完成了整個項目的遷移部署。