麒麟aarch64架构离线部署python相关项目
核心步骤:
1、本地需搞虚拟机(可联网)。安装一个和生产架构一样的系统。如果本机是Intel的,需用arm的,需安装qemu,进行安装该镜像。
2、配置好python所需环境,在该服务器下载相关依赖的包。因python包中有小包,用项目命令生成相关依赖包。
3、整理好所有资料,上传到目标无网服务器进行安装。
一、本地需准备虚拟机和服务器(可联网)
我电脑Intel,目标服务器是麒麟aarch64的架构。
需安装qemu(安装很慢哦,自行安装),自行安装,可参考(实践可用):
链接1:
https://blog.csdn.net/weixin_44255842/article/details/120652227?spm=1001.2014.3001.5506链接2:
https://blog.csdn.net/weixin_44255842/article/details/120652227?fromshare=blogdetail&sharetype=blogdetail&sharerId=120652227&sharerefer=PC&sharesource=eternal_tc&sharefrom=from_link
–安装命令
–进入qemu安装目录
D:\install\qemu
–安装虚拟机命令
qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 8,sockets=4,cores=2 -M virt -bios E:\VM\kylin-server-V10\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=E:\VM\kylin-server-V10\kylindisk.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=E:\jingxiang\Kylin-Server-V10-SP3-2403-Release-20240426-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -net nic -net user,hostfwd=tcp::2222-:22
–启动命令
qemu-system-aarch64.exe -m 8192 -cpu cortex-a72 -smp 8,sockets=4,cores=2 -M virt -bios E:\VM\kylin-server-V10\QEMU_EFI.fd -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd -drive if=none,file=E:\VM\kylin-server-V10\kylindisk.qcow2,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,file=,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -net nic -net user,hostfwd=tcp::2222-:22
进入安装的系统
ssh 127.0.0.1:2222
二、下载相关依赖包
附1:完全卸载包
# 完全卸载 NumPy
python3.10 -m pip uninstall -y numpy# 清理所有残留
sudo find /usr/local/python3.10 -name "*numpy*" -delete 2>/dev/null || true
sudo rm -rf /usr/local/python3.10/lib/python3.10/site-packages/numpy*# 清理缓存
python3.10 -m pip cache purge
附2:python 重新编译安装(SSL无解决办法)
SSL无解决办法(生产不用管,联网环境解决)可以升级pip 和 openssl# 进入 Python 源码目录
cd /usr/local/python3.10/Python-3.10.8# 清理之前的编译
make distclean# 重新配置,但禁用优化(--enable-optimizations 可能导致问题)
./configure \--with-lto \--prefix=/usr/local/python3.10 \--enable-shared \--with-openssl=/usr/local/openssl \--with-openssl-rpath=auto \LDFLAGS="-Wl,-rpath=/usr/local/python3.10/lib"make && make install
附3:核心—外网服务器下载相关依赖包
# 获取代码相关所有依赖包,生成requirements.txt
--导入包命令
pip freeze > requirements.txt# 指定其中之一
pip freeze | grep antlr4 > requirements.txt# 下载所有依赖的简单命令
pip download -r requirements.txt -d /tmp/packages#生产不能连接外网,需找一个可以连接外网相同的服务器架构,下载相关包
/yncz/ocr/noplat_packages 包下载路径# 下载完成命令说明
pip3 download \--only-binary=:all: \ # 只下载二进制包--python-version=3.10 \ # 指定Python版本-d /yncz/ocr/noplat_packages \ # 下载目录-r /yncz/ocr/ocr_code/requirements.txt \ # 依赖文件--ignore-installed \ # 忽略已安装的包-i http://mirrors.aliyun.com/pypi/simple/ \ # 镜像源--trusted-host mirrors.aliyun.com # 信任的主机# 下载单个(会根据平台自行去下载相关包,指定python版本)
pip3 download --only-binary=:all: --python-version=3.10 -d /yncz/ocr/noplat_packages antlr4-python3-runtime -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# 批量下载 (下载相关依赖包:requirements.txt) 不忽略子单安装
pip3 download --only-binary=:all: --python-version=3.10 -d /yncz/ocr/noplat_packages -r /yncz/ocr/ocr_code/requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
# 可更换源 http://mirrors.aliyun.com/pypi/simple/
pip3 download --only-binary=:all: --python-version=3.10 -d /yncz/ocr/noplat_packages -r /yncz/ocr/ocr_code/requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com# 批量下载的时候,失败,比如依赖于antlr4-python3-runtime。先单独安装这个,然后忽略下载已安装。
pip3 download --only-binary=:all: --python-version=3.10 -d /yncz/ocr/noplat_packages -r /yncz/ocr/ocr_code/requirements.txt --ignore-installed -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.compython3.10 -m pip install -r /yncz/ocr/ocr_code/requirements.txt --ignore-installed# 指定平台,python版本(该命令在aarch64平台不使用,会找不到包。所以需用相同平台的可连外网的服务器去下载包)
pip3 download --only-binary=:all: --platform=aarch64 --python-version=3.10 -d /home/projcet/aarch64_packages -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com# 如出现启动包中找不到,可以卸载后重新安装
python3.10 -m pip uninstall Pillow
附4:查看所有的包和源码下载安装
查看相关包网页:
https://pypi.org/
可以下载源码编译安装,可以下载.whl进行安装。架构和python版本需兼容对应。

附5:相关云
# 使用清华源
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple MarkupSafe==3.0.2# 使用阿里云源
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ MarkupSafe==3.0.2# 使用豆瓣源
pip3 install -i https://pypi.douban.com/simple/ MarkupSafe==3.0.2
三、进行离线安装
1、项目说明
pillow 为安装后,找不到包,重新找的包,该包不适配,用不了。
如果安装失败,卸载pillow后重新安装。
2、安装python-3.10.8
是否存在python3.10的版本。路径:usr/local/python3.10
下载路径:wget https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz
本地见压缩包:
#解压
tar -xf Python-3.10.8.tar.xz
进入源码目录
cd Python-3.10.8
#指定编译语言
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN.UTF-8python常见安装教程(参考):
https://blog.csdn.net/ZMXdecode/article/details/138360452#指定安装目录
enable-optimizations 不要,禁用优化(--enable-optimizations 可能导致问题)
./configure \--enable-optimizations \--with-lto \--prefix=/usr/local/python3.10 \--enable-shared \--with-openssl=/usr/local/openssl \--with-openssl-rpath=auto \LDFLAGS="-Wl,-rpath=/usr/local/python3.10/lib"#准备编译
./configure \--with-lto \--prefix=/usr/local/python3.10 \--enable-shared \--with-openssl=/usr/local/openssl \--with-openssl-rpath=auto \LDFLAGS="-Wl,-rpath=/usr/local/python3.10/lib"#编译安装make && make install
创建软件链
此处不能随便修改,之前的连接不能修改,特别是python的,会导致yum命令丢失。如果用不了,需重新创建一个软连接指向python(自带版本通常是2.7)
查看软连接:
# 示例1:查看 /usr/bin/python 软连接信息
Ls -al
ls -l /usr/bin
ls -l /usr/bin/python2
ls -l /usr/bin/pip3#先查看是否存在python3和pip3的软链接
#不存在创建(可全部搞成3.10)
ln -s /usr/local/python3.10/bin/python3.10 /usr/bin/python3.10
ln -s /usr/local/python3.10/bin/pip3.10 /usr/bin/pip3
查看是否安装成功
python3.10 -V
pip3 -V
3、上传相关代码和包
压缩包解压命令:
unzip package-name.zip代码和包放入路径
代码位于
/yncz/ocr/ocr_code包位于
/yncz/ocr/noplat_packagesantlr4-python3-runtime-4.9.3.tar.gz
该包需手动编译安装,路径位于:/yncz/ocr/ 下
4、创建python虚拟运行环境和离线包安装
# 创建虚拟环境
# 进入指定目录,创建
cd /yncz/ocr
# 创建虚拟环境
python -m venv ocrVenv
#激活虚拟环境
source ocrVenv/bin/activate后续会在命令行前面出现一个ocrVenv的名称,表示已经进入了虚拟环境5、安装相关依赖包
注:需进入虚拟环境再安装,把包安装到对应的虚拟环境中进行隔离安装相关依赖包
1、先安装antlr4-python3-runtime-4.9.3.tar.gz用源码安装:
#加压
tar -xzvf antlr4-python3-runtime-4.9.3.tar.gz
进入目录
python3.10 setup.py install2、其次安装其他相关.whl的包
cd /yncz/ocr/noplat_packages# 从本地目录安装命令说明
pip3 install \--no-index \ # 不连接PyPI--find-links=/yncz/ocr/noplat_packages \ # 从本地目录查找-r /yncz/ocr/ocr_code/requirements.txt2.1 如果 whl 文件在当前目录
python3.10 -m pip install ./*.whl
# 离线安装(上面的失败,再用下面这个命令)
python3.10 -m pip install ./*.whl --no-index# 2.2 或者安装指定目录下的所有 whl 文件
python3.10 -m pip install /yncz/ocr/noplat_packages/*.whl3、查看安装的包
#查看所有包
python3.10 -m pip list
#查看某个包
python3.10 -m pip show markupsafe
python3.10 -c "import markupsafe; print('MarkupSafe 版本:', markupsafe.__version__)"
5、启动
#启动
[root@0002 ocr_code]# source /yncz/ocr/ocrVenv/bin/activate
(ocrVenv) [root@0002 ocr_code]# cd /yncz/ocr/ocr_code/ 运行测试,看是否能够启动成功。(不能成功,根据报错解决,大概率是包依赖的问题)
(ocrVenv) [root@0002 ocr_code]# python3.10 testMain.py测试成功后,最终启动命令:
nohup python3.10 main.py > output.log 2>&1 &
6、字体安装
启动提示下载字体,根据报错放入指定目录,需手动放入 FZYTK.TTF
上传到 /yncz/ocr/ocrVenv/lib/python3.10/site-packages/rapidocr/models (对应的虚拟环境中)中文字体安装参考:
https://blog.csdn.net/Xcong_Zhu/article/details/145708377#查看安装的字体
fc-list :lang=zh 上传到
/usr/share/fonts/chinese-fonts
解压
/usr/share/fonts/chinese-fonts/Fonts
更新字体缓存
fc-cache
#查看安装的字体
fc-list :lang=zh
9、启动脚本
#!/bin/bash
# ocr_start.sh - OCR服务启动脚本# 脚本配置
APP_DIR="/yncz/ocr/ocr_code"
VENV_PATH="/yncz/ocr/ocrVenv/bin/activate"
MAIN_SCRIPT="ocrApp.py"
LOG_FILE="output.log"
PROCESS_NAME="ocrApp.py"# 获取进程PID
get_pid() {# 使用ps -ef查找特定进程,排除grep自身ps -ef | grep "$PROCESS_NAME" | grep -v grep | awk '{print $2}'
}# 启动服务
start() {echo "启动OCR服务..."# 检查是否已在运行PID=$(get_pid)if [ -n "$PID" ]; thenecho "OCR服务已在运行 (PID: $PID)"return 1fi# 切换到应用目录cd "$APP_DIR"# 激活虚拟环境并启动应用source "$VENV_PATH"nohup python3.10 "$MAIN_SCRIPT" > "$LOG_FILE" 2>&1 &# 等待一下然后获取PIDsleep 2PID=$(get_pid)if [ -n "$PID" ]; thenecho "OCR服务启动成功 (PID: $PID)"elseecho "OCR服务启动失败,请检查日志: $APP_DIR/$LOG_FILE"fi
}# 停止服务
stop() {echo "停止OCR服务..."PID=$(get_pid)if [ -n "$PID" ]; thenkill $PIDecho "OCR服务已停止 (PID: $PID)"elseecho "OCR服务未运行"fi
}# 重启服务
restart() {stopsleep 3start
}# 查看状态
status() {PID=$(get_pid)if [ -n "$PID" ]; thenecho "OCR服务正在运行 (PID: $PID)"# 显示进程详细信息ps -p $PID -o pid,user,pcpu,pmem,etime,cmdelseecho "OCR服务未运行"fi
}# 强制停止服务
force_stop() {echo "强制停止OCR服务..."PID=$(get_pid)if [ -n "$PID" ]; thenkill -9 $PIDecho "OCR服务已强制停止 (PID: $PID)"elseecho "OCR服务未运行"fi
}# 查看日志
logs() {if [ -f "$APP_DIR/$LOG_FILE" ]; thentail -f "$APP_DIR/$LOG_FILE"elseecho "日志文件不存在: $APP_DIR/$LOG_FILE"fi
}# 显示用法
usage() {echo "用法: $0 {start|stop|restart|status|force-stop|logs}"exit 1
}# 主逻辑
case "$1" instart)start;;stop)stop;;restart)restart;;status)status;;force-stop)force_stop;;logs)logs;;*)usage;;
esac
