应用背景:前面在进行离线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) [super@localhost 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) [super@localhost Downloads]$ conda config --set offline true #由于目标机是离线状态,所以需要执行这句才能在目标机上创建虚拟环境 (base) [super@localhost Downloads]$ conda create -n ocr pip #新建虚拟环境时指定安装pip工具,不然在新建虚拟环境中无法使用pip命令 (base) [super@localhost Downloads]$ conda env list #确认新建的虚拟环境生成成功 (base) [super@localhost Downloads]$ conda activate ocr #在目标机上激活新建的虚拟环境 (ocr) [super@localhost Downloads]$ conda list #确认新建的虚拟环境中包含有pip(自然也有python了) 拷贝requirements.txt文件和对应的安装包文件夹到目标机上,例如requirements.txt就放在当前的Downloads目录,而pip包都存放在当前目录下的packs文件夹下: (ocr) [super@localhost 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) [super@localhost ~]$ ls Desktop ? ?Downloads ?miniconda3 ?Pictures ?Templates Documents ?langdata ? Music ? ? ? Public ? ?Videos (base) [super@localhost ~]$ 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) [super@localhost ~]$ 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) [super@localhost Downloads]$ conda activate ocr (ocr) [super@localhost Downloads]$ ls 0010001.jpg ?0010002.jpg ?imgs2txts.py ?Miniconda3-py39_4.12.0-Linux-x86_64.sh ?pkgs.tar.gz (ocr) [super@localhost 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) [super@localhost 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) [super@localhost Downloads]$ cat 0010001.txt 多地新冠疫苗己经开打!2021年春节即将到来,冬春季疫情防控成为最受关注的话题。虽然多地出现本土确诊病例,但是,近期伴随北京上海深圳等多地新冠疫苗正式开打,防控又多了一道安全屏障。早在元旦之前,国内己有部分地区的重点人群疫苗接种开启。例如,陕西省重点人群接种工作已从2020年12月25日全面启动。首批参加新冠病毒疫苗接种的是海关检验检疫口岸边检口岸进口冷链物品装运及医疗卫生机构的一线工作人员等重点人群。此外,深圳最近也已经为重点人群启动接种工作,主要面向9类高风险人员。其中进口冷链物流相关人员。隔离场所工作人员 海关边检人员等8类重点人群都是通过工作单位统一预约接种。 (ocr) [super@localhost 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和文件夹); ?
|