在Docker debian容器中编译aarch64平台python3.11.9,并创建可离线迁移到统信uos2.0的开发环境

办公室统信Uos2.0没有公网访问权限,而我需要在办公室进行excel数据分析,于是想在能够上网的电脑上,安装部署一个python开发环境,再迁移到uos2.0系统上。通过两天的倒腾,在kimi的提示下,初步完成了这一目标。

一、在能够上网的windows11上,安装一个能够在uos2.0系统上运行的pyton3.11环境。

1.首先确定办公室uos2.0系统的系统架构

统信uos2.0是基于 Debian 10 的 arm64/amd64 双架构系统,在办公室uos2.0控制台中运行命令:

复制代码
uname -m

结果是:aarch64

2.Arm64平台运行aarch64系统的方案

我的windows11电脑是arm64架构的,所以要在windows11上运行aarch64有两种方案:一种是Docker Desktop + binfmt,用Docker Desktop 的 binfmt/arm64 容器,跑 arm64v8/debian:10 容器当"下载机",拉出 100% 兼容 UOS 的离线包。另一种是QEMU 虚拟机。我使用了第一种,理由是可以随时重置一个干净的debian容器,这对多次安装测试非常有利。

3.利用Docker部署debian10-aarch64系统

我的windows11系统上已经有了docker desktop,所以打开命令行:

启用 binfmt 自动拉取 arm64 模拟器

复制代码
docker run --privileged --rm tonistiigi/binfmt --install arm64

验证

复制代码
docker run --rm arm64v8/debian:10 uname -m

→ 应输出 aarch64

4.在windows11电脑上建立一个映射到虚拟机的交换目录

#windows上建立目录

复制代码
mkdir d:\uos_dev

#启动名称为uos_python的debian新容器,进入容器内的bash控制台,映射将windows目录映射到容器/out目录上

复制代码
docker run -it --name uos_python -v D:\uos_dev:/out \
       arm64v8/debian:10 bash

5. 换debian10的安装源

Kimi提示"Debian 10 官方仓库 2022-08 已把 backports 归档到 archive.debian.org",因此要更换系统安装源

重写整个 sources.list(只用 archive.debian.org

复制代码
tee /etc/apt/sources.list <<'EOF'

deb http://archive.debian.org/debian buster main contrib non-free

deb http://archive.debian.org/debian buster-backports main contrib non-free

EOF

删除重复源文件(消除 Warning)

复制代码
rm -f /etc/apt/sources.list.d/buster-backports.list

允许访问归档

复制代码
echo 'Acquire::Check-Valid-Until "false";' | tee /etc/apt/apt.conf.d/99-no-check

#更新

复制代码
apt update

6. 下载编译环境及依赖

我在这个环节实际上消耗了较多的时间,因为docker拉取的debian10镜像仅是一个基础系统,其中没有编译环境,我一开始使用apt install build-essential时,出现了依赖缺失和版本冲突,我将缺失的系统库和版本冲突库罗列出来,增加缺失库,并将系统中版本冲突的库,用apt提示要示的版本替换,同时通测试安排正确的安装顺序,最终安装编译环境的命令为如下三个:

复制代码
apt install  uuid-runtime libc6=2.28-10+deb10u1 libc6-dev g++ dpkg-dev bzip2-doc \
     libbz2-1.0=1.0.6-9.2~deb10u1  libtinfo6=6.1+20181013-2+deb10u2 libgpm2 \
     libncursesw6=6.1+20181013-2+deb10u2 libncurses-dev libuuid1=2.33.1-0.1 \
     zlib1g=1:1.2.11.dfsg-1+deb10u1 \
     build-essential libssl-dev zlib1g-dev \
     libbz2-dev libreadline-dev libsqlite3-dev libffi-dev \
     libncursesw5-dev libgdbm-dev liblzma-dev uuid-dev

apt install -y python3-dev python3-pip

#下述第三个命令解决编译时缺失_dbm和_tkinter库的警告。Kimi提示"这些只是"可选扩展模块"缺失的友情提示,除非你真的需要 _tkinter(图形界面)或 _dbm(Berkeley DB),否则无需理会,Python 主程序照样能正常安装使用。如果你确实想"洁癖式"地补齐,再装下面几个包即可"。我恰巧是"洁癖式"的......

复制代码
apt install -y libgdbm-dev tk-dev

二、在debian10容器中编译python3.11.9

1.下载python3.11.9.tgz

在windows11上下载https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz,将其放到d:\uos_dev目录中。

2.进入uos_python容器/out目录

复制代码
cd /out
tar xf Python-3.11.9.tgz
cd Python-3.11.9

3.执行编译配置

复制代码
./configure --enable-optimizations \
            --with-ensurepip=install \
            --prefix=/opt/python311

--enable-optimizations:启用 Profile-Guided Optimization,性能 ≈ 官方 deb。

--prefix=/opt/python311:与系统 /usr/bin/python3.7 隔离,安全升级。

注意/opt/python311这个目录很关键,因为在迁移时,要将编译后的python3.11.9包,存放到uos2.0系统相同的目录中。

运行configure需要一些时间,并且可能会出现一些警告提示,一般出行运行完成提示,就可以进行下一步make尝试。

4.编译

复制代码
make -j$(nproc)

如果你足够幸运,且按前述操作准备好了编译环境,那可能跑一次就能编译成功了。

5. 安装

复制代码
make altinstall

此命令运行后,将得到 /opt/python311/bin/python3.11

三、在debian10容器中配置python虚拟环境,以便于整体迁移

1.确认安装路径

若刚才配置 --prefix=/opt/python311 → 那么所有文件已在/opt/python311。

在/opt/python311目录下,有bin、lib/python3.11、 /include/python3.11、/share这4个子目录。

2.创建python3.11虚拟环境

进uos_python容器,执行下述命令

复制代码
cd /out
/opt/python311/bin/python3.11 -m pip --version
/opt/python311/bin/python3.11 -m venv /out/py311-env
source /out/py311-env/bin/activate
python -c "import sys, ssl, sqlite3; print(sys.version)"

其中第2行和第4行用于验证python3.11安装结果

3.下载需要的库到debs和wheels文件夹

复制代码
mkdir -p /out/py311-offline/debs

mkdir -p /out/py311-offline/wheels

python -m pip download -d /out/py311-offline/wheels \
        pip setuptools wheel requests numpy pandas openpyxl python-docx

python -m pip download -d /out/py311-offline/wheels \
        jupyter jupyterlab onnx onnxruntime

4.把 Python 运行时依赖的 系统库 导出成 deb 列表

复制代码
dpkg -l | awk '/lib(ssl|crypto|ffi|lzma|sqlite|gdbm|tk|ncurses|readline|zlib)/{print $2}' | sort -u > /tmp/py-deps.lst

cd /out/py311-offline/debs

cat /tmp/py-deps.lst | xargs -i apt download {}

5. 复制 Python 3.11.9 整个 tree

复制代码
mkdir -p /out/py311-offline/python3.11

cp -a /opt/python311/* /out/py311-offline/python3.11/

6. 将虚拟环境移动到/out/py311-offline

复制代码
mv /out/py311-env /out/py311-offline/

7. 生成一键环境脚本

复制代码
tee /out/py311-offline/py311-activate.sh <<'EOF'
#!/bin/bash
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export PATH=$DIR/python3.11/bin:$PATH
export LD_LIBRARY_PATH=$DIR/python3.11/lib:$LD_LIBRARY_PATH
source $DIR/py311-env/bin/activate
EOF

chmod +x /out/py311-offline/py311-env.sh

8. 打包

复制代码
cd /out

tar czf py311-offline-uos.tar.gz py311-offline

9.将py311-offline-uos.tar.gz拷贝到U盘,复制到uos2.0中

至此,在wihdows11上debian10容器中的操作完成

四、向uos2.0迁移

1. 解包

打开uos2.0控制台,将py311-offline-uos.tar.gz复制到任一目录中,比如/data/home/user

复制代码
cd /data/home/user

tar xzf py311-offline-uos.tar.gz

sudo mkdir /out

ln -s /data/home/user/py311-offline /out

2.将python3.11.9软件包复制到uos2.0系统的/opt/python311目录中

复制代码
mkdir /p /opt/python311
cp -a /out/python3.11/* /opt/python311/

3.激活环境并安装包

复制代码
cd /out

source ./ py311-activate.sh

python -V #此时应该是3.11.9

4.如果python版本正确,则安装各程序包

复制代码
python -m pip install --no-index --find-links=./wheels -U \
     pip setuptools wheel   # 先升级工具本身

python -m pip install --no-index --find-links=./wheels \
     jupyter onnx onnxruntime numpy pandas openpyxl python-docx ##安装包

#验证

复制代码
python -c "import sys, jupyter, onnx; print(sys.version)"

看到 3.11.9 且无 ImportError 即成功

5.运行jupyter

复制代码
jupyter lab --no-browser --ip=0.0.0.0

五、需要说明的一些问题

1.在安装编译器和编译过程中,会出现很多依赖关系、错误、警告提示,建议手头的电脑随时打开一个AI工具如kimi或Deepseek,让AI帮助解决问题。

2.安装torch时,kimi提示说python3.11目前没有适配aarch64平台的torch版本,但是python3.9有,因为目前非必需,所认我没有偿试。

3.现在写代码,没有代码提示功能我基本就半废了,所以jupyter中的cell调试和代码提示是非常必要的。

kimi提示我:Jupyter 默认只提供最基础的「Tab 补全」和「Shift+Tab 文档弹窗」。

Cell 内逐行调试、函数签名悬浮提示、自动补全等高级功能 并非安装 jupyter 包后就自带 ,需要额外给 前端(Notebook/JupyterLab)内核 各装一套插件。下面按「代码提示」和「可视化调试」两类功能给出离线可用方案,全部基于 wheel 安装,可在你的 UOS 2.0 环境直接复现。

(1)其中代码补全有两个方案:
A方案:代码智能提示(自动补全 + 签名悬浮)

在离线机(已激活 py311-env)执行

复制代码
# 1. 下载离线包(在联网机预先抓 wheel)
pip download -d /out/py311-offline/wheels --only-binary=:all: \
  jupyter_contrib_nbextensions jupyter_nbextensions_configurator

# 2. 离线安装
pip install --no-index --find-links=wheels \
  jupyter_contrib_nbextensions jupyter_nbextensions_configurator

# 3. 安装 JS/CSS 并启用配置器
jupyter contrib nbextension install --sys-prefix
jupyter nbextensions_configurator enable --sys-prefix

启动 Notebook 后,浏览器会多出一个 Nbextensions 标签页

→ 取消右上角 "disable configuration"

→ 勾选 Hinterland (实时补全)

→ 可选勾选 Codefolding / ExecuteTime 等辅助扩展

保存即生效,无需重启服务器。

B方案:如果你更习惯 JupyterLab ,则用 jupyterlab-lsp 方案:
复制代码
pip download -d /out/py311-offline/wheels --only-binary=:all: \
  jupyterlab-lsp python-lsp-server[all]
pip install --no-index --find-links=wheels \
  jupyterlab-lsp python-lsp-server[all]
jupyter lab build      # 离线前预先 build 好
(2)可视化调试(打断点、单步、查看变量)

Jupyter 官方调试协议要求 内核 + 前端 同时支持:

复制代码
# xeus-python 已提供 cp311 linux_aarch64 官方 wheel
pip download -d /out/py311-offline/wheels --only-binary=:all: xeus-python
pip install --no-index --find-links=wheels xeus-python
# 注册内核
python -m xeus_python.install --sys-prefix

前端插件(JupyterLab ≥ 3 已内置,Notebook 需手动装)

  • 新建笔记 → 菜单 Kernel → Change Kernelxeus-python

  • 右侧出现 Bug 图标(Debug 面板)

  • 在代码行号点一下即可打断点,▶ Run ▶ Debug Cell 开始单步调试

    可查看变量、调用栈、评估表达式,与 VSCode 体验类似。

上述代码补全和Cell内调试,我尚未偿试,在这里我将kimi的提示展示出来,有时间的朋友可以偿试一下,若能将结果也反馈给我,我将不胜感谢。

最后,还是希望统信uos能够发布一个完整的python离线安装包,实现一键离线部署,增强用户平台使用的体验。

相关推荐
wydd99_lll2 小时前
docker特权模式下逃逸
运维·docker·容器
mseaspring3 小时前
一款用于监控跨多台主机 Docker 容器的实时终端
运维·docker·容器
SPC的存折8 小时前
6、Docker常用配置
运维·docker·容器
图图玩ai8 小时前
SSH 命令管理工具怎么选?从命令收藏到批量执行一次讲清
linux·nginx·docker·ai·程序员·ssh·可视化·gmssh·批量命令执行
SPC的存折9 小时前
4、Docker私有仓库
运维·docker·容器
齐潇宇10 小时前
Docker概述与安装
linux·运维·docker·容器
亚空间仓鼠11 小时前
Docker 容器技术入门与实践 (二):Dockerfile文件
运维·docker·容器
亚空间仓鼠11 小时前
Docker 容器技术入门与实践 (一):命令与镜像、容器管理
运维·docker·容器
东北甜妹12 小时前
Docker 多阶段构建
运维·docker·容器
Zhu75812 小时前
【软件部署】docker环境部署nagios
运维·docker·容器