程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Linux系統python(虛擬)環境的遷移

編輯:Python

應用背景:前面在進行離線ocr實現時,需要在線安裝好easyOCR工具包以及用於支持pdf圖像提取的pdf2img包,然後將這個環境離線遷移到不能上網的centOS系統的生產環境服務器上,所以除了在能夠上網的電腦上配置python OCR開發環境外(我是在自己的個人筆記本電腦上利用VMware虛擬一個centOS虛擬機、然後在虛擬機裡面配置python開發環境和easyOCR環境),最重要的就是如何將在線的Linux系統遷移到離線的系統中去(實際上是將ocr環境遷移到離線的服務器上後,將該系統制作為一個docker來使用)?

測試結論:先說結論吧!

1-分別下載離線包重新安裝的方式:待遷移系統可聯網條件下,那麼可以(利用pip list --format=freeze > requirements.txt命令)生成源系統中對應的requirements.txt文件、然後(利用pip download -r requirements.txt -d packs/ -i https://mirrors.aliyun.com/pypi/simple/ 命令)將源系統上的python包離線下載對應的離線安裝包文件,最後將這些包文件和requirements.txt文件均拷貝到目標機上,再利用pip install  --no-index --find-links=./packs/ -r requirements.txt即可生成與源電腦相同的系統,下載下來的離線安裝包packs內容如下圖所示:

requirements.txt文件的內容如下所示:

 將上面的均拷貝到離線目標系統中後,再進入到虛擬環境中安裝即可,如下圖所示:

2-直接拷貝安裝後文件夾的方式:待遷移系統可以不聯網,直接將安裝包所在的文件夾全部內容直接拷貝替換新的Linux系統中對應的文件夾即可!(當然,為了避免拷貝大量小文件出錯,可以利用壓縮——解壓的方式拷貝)

具體來看,由於一般情況下我們均使用conda來生成一個虛擬環境,而不是直接在系統中安裝python環境,所以需要拷貝的文件夾就是虛擬環境對應的文件夾了(例如home/miniconda3/envs/ocr/),例如,假設我生成的虛擬環境名字為ocr,則拷貝的文件夾如下圖所示:

 如果還是不行,那就是虛擬環境中可能使用到了系統pkgs文件夾中的全局包(例如home/miniconda3/pkgs/)了,那就再把pkgs文件夾一並拷貝到目標系統並覆蓋,如下圖所示:

 拷貝後,無需再利用conda create --name ocr命令,直接運行conda env list命令,即可發現已經有了虛擬環境ocr了,如下圖所示:

 直接激活該ocr環境,即可使用了:

 最後,簡要總結如下:

##############################
#    pip 離線環境安裝(簡要版)
##############################
所需軟件:
CentOS-7-x86_64-DVD-1708.iso
Miniconda3-py39_4.12.0-Linux-x86_63.sh

1.本地生成 requirements
pip list #查看安裝的包
pip list --format=freeze > requirements.txt #查看已安裝的包(帶版本號)並導出到requirements.txt文件中
#pip freeze > requirements.txt #將已安裝包的名稱導出到requirements.txt文件中(會一並記錄包的來源地址,適合遷移到另一台可上網環境,無法用於離線遷移)
2.創建存放安裝包的目錄
mkdir /packs
3.從指定源下載需要文件到指定文件夾裡
pip download -r requirements.txt -d packs/ -i https://mirrors.aliyun.com/pypi/simple/
4.本地安裝
pip install --no-index --find-links=./packs/ -r requirements.txt
如果無法離線創建虛擬環境,就需要運行下面的conda命令:
conda config --set offline true

 詳細版本如下:

############################################
easyOCR離線開發環境部署攻略---在線配置下載
############################################
1.找一台可以上網的電腦,安裝好與目標機一樣的linux系統(我這裡使用的是在windows系統物理機上用VMware Workstation虛擬機創建的centOS7 64-bit系統):
CentOS-7-x86_64-DVD-1708.iso

2.下載並安裝Miniconda3(可以在windows物理機上下載後拷貝到centOS虛擬機上,也可以直接在centOS虛擬機上下載)
!!!注意第一個坑:在物理機與centOS虛擬機之間進行拷貝時,不要用鼠標直接拖動的方式,要用ctrl+C/ctrl+V的方式,因為前者會丟包,尤其是當文件較大時,拷貝幾百兆的文件到虛擬機上可能只有幾十兆了,很容易出現莫名其妙的錯誤,原因未知!!!
bash Miniconda3-py39_4.12.0-Linux-x86_63.sh

3.根據個人需要,可以創建虛擬python環境然後在該虛擬環境下的lib文件夾下安裝python包,當然也可以不創建而是在Miniconda3的lib文件夾下直接安裝python包:
conda create --name ocrenv
conda activate ocrenv

4.安裝python包(其他包也是一樣的,例如我同步安裝了分詞的jieba、打包的pyinstaller等):
pip install easyocr -i https://mirrors.aliyun.com/pypi/simple/

5.測試環境是否OK,例如運行編譯一個導入了easyocr包的python源程序看結果正確與否:
python ./img2txt.py 001.jpg 002.jpg

6.生成本地python環境的requirements.txt
pip list --format=freeze > requirements.txt #查看已安裝的包(帶版本號)並導出到requirements.txt文件中
#pip freeze > requirements.txt #將已安裝包的名稱導出到requirements.txt文件中(會一並記錄包的來源地址,適合遷移到另一台可上網環境,無法用於離線遷移)

7.根據requirements.txt下載當前環境所需的python包:
pip download -r requirements.txt -d packs/ -i https://mirrors.aliyun.com/pypi/simple/
其中,-d表示指定包下載的文件夾目錄(必須事先創建好,這裡是當前目錄下的packs文件夾,在linux環境下可以利用"mkdir ./packs/"命令創建)
常用的國內鏡像源有:
阿裡雲:https://mirrors.aliyun.com/pypi/simple/
清華雲:https://pypi.tuna.tsinghua.edu.cn/simple
中科大:https://pypi.mirrors.ustc.edu.cn/simple
騰訊雲:http://mirrors.tencentyun.com/pypi/simple
豆瓣:  https://pypi.douban.com/simple
上面使用-i參數選項指定網址是臨時配置,每次都輸入比較麻煩,也可以參考https://blog.csdn.net/swq404/artical/details/119080901進行永久配置;

(1)編輯配置文件
vim ~/.pip/pip.conf
如果不行,嘗試
cd ~ && mkdir .pip
cd .pip && vim pip.conf
(2)修改配置文件
[global]
index-url = https://pypi.mirrors.ustc.edu.cn/simple

8.將packs文件夾和requirements.txt文件兩者從當前centOS上拷貝出來,准備進行下一步的本地部署安裝:
這裡需要注意前面的提出的那個坑,從centOS虛擬機中往物理機拷貝文件時,不要使用拖動,容易出錯!也可以在centOS中將packs文件夾壓縮後再拷貝出來。
至此,U盤或者准備的部署包中應該包括如下的文件:
文件夾packs
文件requirements.txt
文件Miniconda3-py39_4.12.0-Linux-x86_63.sh

############################################
easyOCR離線開發環境部署攻略---離線安裝部署
############################################
將前述文件拷貝到離線的centOS目標機上;
1.安裝Miniconda3:
bash Miniconda3-py39_4.12.0-Linux-x86_63.sh

2.使配置生效(也可以關閉當前終端再重新打開新終端的方式使安裝生效,但在docker鏡像制作的時候由於不能關閉當前終端所以就需要通過顯式調用下面命令的方式)
source /root/.bashrc

3.同上,可以根據個人需要看是否創建虛擬環境、在虛擬環境下進行安裝:
conda create --name ocrenv
conda activate ocrenv

4.安裝下載的ocr python包(注意:--find-links選項指定離線包所在文件夾的目錄,一般是進入到requirements.txt所在的目錄執行,不是的話也可以指定後者的路徑)
pip install --no-index --find-links=./packs/ -r requirements.txt
至此包含easyocr的python開發環境已經部署完畢,可以利用import python進行OCR應用開發了!
但是,此時的命令行命令為如下格式:
python ./img2txt.py 001.jpg 002.jpg
如果需要將前面的python也省略,變為如下的命令:
./img2txt.py 001.jpg 002.jpg
需要再進行如下兩步操作:

5.在python源文件中首行添加一句python執行環境的地址(要根據個人電腦環境而改變,如果不知道的話可以利用whereis python命令來查詢系統中所有的python路徑,但是注意電腦中可能有多個python,尤其是利用Miniconda3安裝多個虛擬環境時,這時就要自己判斷現在所用的ocr開發環境是哪個python路徑了):
#!/usr/bin/python
# coding=utf-8

#!/root/miniconda3/bin/python
# coding=utf-8

#!/home/super(計算機用戶名)/miniconda3/bin/python
# coding=utf-8

6.將python源文件中的換行符由windows環境下的CR LF換為linux環境下的LF,不然會報如下錯誤:
[errno -3]:#!/root/miniconda3/bin/python^M: bad interpreter: No such file or directory ...
利用Notepad++軟件時,可以利用命令:編輯->文檔格式轉換->轉為Unix(LF)菜單完成轉換,然後拷貝覆蓋即可;


##############################
#    conda 常用命令
##############################
conda env list #列出當前存在的環境
conda create --name myenv #新建虛擬環境
conda create --name myenv python=3.10 #新建虛擬環境(指定python版本)
conda activate myenv #激活指定虛擬環境
conda env remove --name myenv #刪除指定環境


##############################
#    conda 離線遷移常見錯誤
##############################
無法創建虛擬環境出錯時:
(base) [[email protected] Downloads]$ conda create -n myenv
Collecting package metadata (current_repodata.json): done
Solving environment: done
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/current_repodata.json>
Elapsed: -
An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.
'https://repo.anaconda.com/pkgs/main/linux-64'

conda config --show-sources 查找conda的配置文件,默認在用戶目錄下,注意Linux中ll或ls看不到以點開頭的隱藏文件,需要使用-all選項才可以看到隱藏文件
如果為空,則表示默認連接網絡,離線環境下就會出錯;
就在/home/super也即用戶目錄下創建.condarc文件,並添加下面一句:
offline: true
或者簡單的執行下面的一句命令,就會自動的完成上述工作:
conda config --set offline true


##############################
#    conda 離線遷移環境
##############################
一句話,就是直接將聯網電腦上的虛擬環境文件夾(壓縮後)拷貝到目標機上對應的envs文件夾(解壓縮)即可;壓縮的目的是為了避免復制文件出錯!
在我的centOS-7電腦上,利用conda create命令建立虛擬環境後的目錄是/home/super/Miniconda3/envs/文件夾;
如果還不行,就再把 Miniconda3/pkgs 也壓縮拷貝過來替換即可;
------------------------------------------------------------------
具體操作就是:
(base) [[email protected] Downloads]$ conda config --set offline true #由於目標機是離線狀態,所以需要執行這句才能在目標機上創建虛擬環境
(base) [[email protected] Downloads]$ conda create -n ocr pip #新建虛擬環境時指定安裝pip工具,不然在新建虛擬環境中無法使用pip命令
(base) [[email protected] Downloads]$ conda env list #確認新建的虛擬環境生成成功
(base) [[email protected] Downloads]$ conda activate ocr #在目標機上激活新建的虛擬環境
(ocr) [[email protected] Downloads]$ conda list #確認新建的虛擬環境中包含有pip(自然也有python了)
拷貝requirements.txt文件和對應的安裝包文件夾到目標機上,例如requirements.txt就放在當前的Downloads目錄,而pip包都存放在當前目錄下的packs文件夾下:
(ocr) [[email protected] Downloads]$ pip install -r requirements.txt --no-index --find-links=./packs/
如果此時在激活的ocr虛擬環境中分別運行conda list和 pip list命令的話,就會發現conda list列出來的python包要比pip list中的多,而多出來的那部分正是前面新建虛擬環境時就安裝的那幾個;
此時,ocr虛擬環境已經部署完畢,可以運行一個ocr程序進行測試一下了:
在測試之前還需要把序言包langdata放在程序中指定的位置:
此處,我是放置在/home/langdata位置,由於在根目錄/home/上沒有寫權限,所以我先把langdata放在用戶super下,然後再mv過去:
(base) [[email protected] ~]$ ls
Desktop    Downloads  miniconda3  Pictures  Templates
Documents  langdata   Music       Public    Videos
(base) [[email protected] ~]$ sudo mv langdata ..
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for super: 
(base) [[email protected] ~]$ python imgs2txts.py 0010001.jpg 0010002.jpg
或者(當在python源程序imgs2txts.py的第一行添加了python路徑後)
./imgs2txts.py 0010001.jpg 0010002.jpg
至此,ocr的開發環境就已經部署完畢!
------------------------------------------------------------------
然後,將虛擬環境/home/super/Miniconda3/envs/下面的ocr文件夾壓縮,拷貝到目標機的相同位置,解壓:
此時,再運行conda env list就會發現,雖然在目標機上並沒有運行conda create -n ocr pip命令來創建虛擬環境,也可以看到拷貝過來的虛擬環境了,如下所示:

(base) [[email protected] Downloads]$ conda activate ocr
(ocr) [[email protected] Downloads]$ ls
0010001.jpg  0010002.jpg  imgs2txts.py  Miniconda3-py39_4.12.0-Linux-x86_64.sh  pkgs.tar.gz
(ocr) [[email protected] Downloads]$ python imgs2txts.py 0010001.jpg 0010002.jpg
CUDA not available - defaulting to CPU. Note: This module is much faster with a GPU.
/home/super/miniconda3/envs/ocr/lib/python3.9/site-packages/torchvision/models/_utils.py:252: UserWarning: Accessing the model URLs via the internal dictionary of the module is deprecated since 0.13 and will be removed in 0.15. Please access them via the appropriate Weights Enum instead.
  warnings.warn(/home/super/miniconda3/envs/ocr/lib/python3.9/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and will be removed in 0.15, please use 'weights' instead.
  warnings.warn(/home/super/miniconda3/envs/ocr/lib/python3.9/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and will be removed in 0.15. The current behavior is equivalent to passing `weights=None`.
  warnings.warn(msg)
(ocr) [[email protected] Downloads]$ ls
0010001.jpg  0010001.txt  0010002.jpg  0010002.txt  imgs2txts.py  Miniconda3-py39_4.12.0-Linux-x86_64.sh  pkgs.tar.gz
(ocr) [[email protected] Downloads]$ cat 0010001.txt
多地新冠疫苗己經開打!2021年春節即將到來,冬春季疫情防控成為最受關注的話題。雖然多地出現本土確診病例,但是,近期伴隨北京上海深圳等多地新冠疫苗正式開打,防控又多了一道安全屏障。早在元旦之前,國內己有部分地區的重點人群疫苗接種開啟。例如,陝西省重點人群接種工作已從2020年12月25日全面啟動。首批參加新冠病毒疫苗接種的是海關檢驗檢疫口岸邊檢口岸進口冷鏈物品裝運及醫療衛生機構的一線工作人員等重點人群。此外,深圳最近也已經為重點人群啟動接種工作,主要面向9類高風險人員。其中進口冷鏈物流相關人員。隔離場所工作人員 海關邊檢人員等8類重點人群都是通過工作單位統一預約接種。
(ocr) [[email protected] Downloads]$ 
如果在拷貝到目標機的時候還想為虛擬環境改個名字,可以運行命令
conda create -n ocr2 --clone /home/Miniconda3/envs/ocr --offline

##############################
#    conda 聯網/離線安裝包
##############################
1.在本地聯網計算機上安裝好環境,然後生成conda虛擬環境安裝包列表(注意:非通過conda命令安裝的python包將不包含在內,例如pip install方式安裝的)
conda list --explicit > conda-requirements.txt
生成的txt文件內容如下所示:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/ca-certificates-2022.6.15-ha878542_0.tar.bz2
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2
...
explicit意為明確的,--explicit選項的意思是在列出包信息的時候是列出包的來源,對於聯網安裝的包自然就是其下載來源的URL了!
注意:conda list命令還有一個選項--export,意思是在list出當前環境中安裝的包名字時,同時指出版本:
conda list --export > requirements.txt
生成的txt文件內容如下所示:
nbconvert=6.5.0=pyhd8ed1ab_0
nbconvert-core=6.5.0=pyhd8ed1ab_0
nbconvert-pandoc=6.5.0=pyhd8ed1ab_0
nbformat=5.4.0=pyhd8ed1ab_0
...
注意,conda中很多選項都有對應的縮寫,使用完整單詞時是兩個短劃線,使用縮寫時是一個短劃線,例如:--name和-n,--file和-f,--help和-h等;
但是,對於由於explicit和export具有相同首字母e,就只能對應一個了,這裡-e對應後者,也即export選項。

2.如果目標機可以聯網,那麼只需將上面得到的conda-requirements.txt拷貝到目標機上後,在目標機上運行;
conda create --name <envname> --file conda-requirements.txt 
即可根據conda-requirements.txt中制定的網址自行重新下載安裝了;

3.如果目標機不能聯網,由於conda-requirements.txt中所有的包都是帶有網址的壓縮包,所以可以通過迅雷之類的下載軟件全部下載下來到一個文件夾裡,然後將下載的壓縮包文件夾拷貝到目標機上,然後運行:
conda create --name ocr --offline --file ./conda-ocr/*
這裡的--file選項指定的就不是一個文件,而是一個文件夾了!

##############################
#    conda 本地安裝包安裝
##############################
conda install --use-local package_name
conda install --file package_name
conda install --file requirements.txt
conda install --offline --file ./packs/*
也就是說,--file選項既可以指定一個安裝包,也可以指定一個環境配置txt文件,還可以指定一個存放多個安裝包的文件夾(且不需要像pip那樣同時需要txt和文件夾);
 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved