摘要:
国产化替代浪潮下,很多项目需要部署在麒麟 V10 (飞腾处理器aarch64)上运行。这些系统通常处于内网环境,无法直接联网安装 Python 依赖。本系列文章提供一套完整方案,在 Windows 上借助 Docker 模拟 aarch64 环境,完成 Python 版本升级、依赖下载、依赖编译,将产物拷贝到麒麟上部署。 这篇博文介绍:在 Docker 容器中安装项目所需的全部纯 Python 依赖,打包成一体的 tar.gz,实现"解压即有全部依赖"。同时介绍在 PyCharm 中配置虚拟环境的正确方式。
在第一篇中,我们在 Windows 上搭建了 Docker aarch64 环境,使用 debian:11-slim 基础镜像 + python-build-standalone 预编译包,成功将 Python 3.10.11 打包为 python310_arm64.tar.gz,并在麒麟 V10 上解压即用。
但那个环境只有 Python 解释器和 pip,没有任何第三方依赖。如果项目需要 pysnmp、requests、pyinstaller 等包,还需要在麒麟上逐个离线安装,非常繁琐。
本文聚焦:在 Docker 容器中安装项目所需的全部纯 Python 依赖,打包成一体的 tar.gz,实现"解压即有全部依赖"。同时介绍在 PyCharm 中配置虚拟环境的正确姿势。
特别说明:本人不论在编程还是麒麟系统的使用都是新手,文章供大家讨论,如果大家还有更好、更方便的方法请大家留言指出!
一、采用 Docker 的必要性
.whl 文件,拷贝到离线机器上安装。但这个"有网络的机器"是 Windows(x86_64)还是 Docker 容器(aarch64),结果差异其实挺大的。以下是同一组依赖的实测对比:
# Windows 方式(x86_64 机器,指定 aarch64 平台参数)pip download -d D:\wheels --platform manylinux2014_aarch64 --python-version 3.8 --abi cp38 --only-binary=:all: pysnmp requests certifi idna pyasn1-modules urllib3 charset-normalizer pyinstaller# Docker 方式(真实 aarch64 容器)docker run --rm --platform linux/arm64 -v D:\wheels_docker:/output python:3.8-slim bash -c "pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && pip download -d /output pysnmp requests certifi idna pyasn1-modules urllib3 charset-normalizer pyinstaller"
Windows 下载结果(15 个文件):
altgraph-0.17.5-py2.py3-none-any.whlcertifi-2026.6.17-py3-none-any.whlcharset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.whlidna-3.15-py3-none-any.whlpackaging-26.2-py3-none-any.whlpefile-2024.8.26-py3-none-any.whl# ← 麒麟用不到(Windows 专用)pyasn1-0.6.3-py3-none-any.whlpyasn1_modules-0.4.2-py3-none-any.whlpyinstaller-6.21.0-py3-none-manylinux2014_aarch64.whlpyinstaller_hooks_contrib-2026.6-py3-none-any.whlpysnmp-7.1.5-py3-none-any.whlpywin32_ctypes-0.2.3-py3-none-any.whl# ← Windows 专用,麒麟用不到requests-2.32.4-py3-none-any.whlsetuptools-75.3.4-py3-none-any.whlurllib3-2.2.3-py3-none-any.whl
Docker 容器下载结果(15 个文件):
altgraph-0.17.5-py2.py3-none-any.whlcertifi-2026.6.17-py3-none-any.whlcharset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.whlidna-3.15-py3-none-any.whlimportlib_metadata-8.5.0-py3-none-any.whl#← 依赖完整!packaging-26.2-py3-none-any.whlpyasn1-0.6.3-py3-none-any.whlpyasn1_modules-0.4.2-py3-none-any.whlpyinstaller-6.21.0-py3-none-manylinux2014_aarch64.whlpyinstaller_hooks_contrib-2026.6-py3-none-any.whlpysnmp-7.1.5-py3-none-any.whlrequests-2.32.4-py3-none-any.whlsetuptools-75.3.4-py3-none-any.whlurllib3-2.2.3-py3-none-any.whlzipp-3.20.2-py3-none-any.whl#← 依赖完整!
对比上述的文件,虽然都是15个文件,但是采用docker下载,依赖更为完整。
| 依赖完整性 | importlib-metadata、zipp | |
| 冗余文件 | pefile、pywin32-ctypes(Windows 专用) | |
| 安装成功率 | ||
| 操作复杂度 |
主要的原因在于,Windows 的 pip 在指定 --platform manylinux2014_aarch64 时,依赖解析存在已知局限:某些间接依赖(如 importlib-metadata → zipp)在跨平台解析时可能被跳过。而 Docker 容器运行在真实的 aarch64 Linux 内核上,pip 的依赖解析 100% 准确。
上述问题是我采用docker下载python依赖的主要动因。下载完的依赖包,可以拷贝到麒麟系统进行安装,也可以在 Docker 容器里 pip install,然后把整个 Python 环境重新打包。这样麒麟上解压即有全部依赖,一步到位。
二、采用 Docker 下载和打包方法
2.1 判断依赖包类型
在开始之前,先了解如何判断一个包是否需要特殊处理。Python 包分三种:
py3-none-any.whl | ||
manylinux...aarch64.whl | ||
.tar.gz 源码 |
判断方法:浏览器打开 https://pypi.org/simple/包名/ ,Ctrl+F 搜索:
搜 none-any → 纯 Python,全平台通用
搜 aarch64 → 有 aarch64预编译 wheel
都搜不到 → 需要源码编译(下一篇会专门讲)
我的项目涉及的 pysnmp、requests、certifi、idna 等都是纯 Python 包,直接用 pip 安装即可。
首先是启动容器,如果你第一篇的容器还在运行,可以用 docker ps 查看容器 ID
,任何直接进入:
docker exec -it 容器ID bash如果容器已退出,重新启动一个:
docker run --rm -it --platform linux/arm64 -v D:\pytq-test:/output debian:11-slim bash然后重新安装 Python 3.10(两步即可):sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.listapt-get updatetar -xzf /output/cpython-3.10.11+20230507-aarch64-unknown-linux-gnu-install_only.tar.gz -C /usr/local --strip-components=1
安装项目依赖:# 配置 pip 国内源pip3.10 config set global.index-url https://mirrors.aliyun.com/pypi/simple/# 安装项目所需的纯 Python 依赖pip3.10 install pysnmp requests certifi idna pyasn1-modules urllib3 charset-normalizer
输出:
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/Collecting pysnmpDownloading pysnmp-7.1.27-py3-none-any.whl (344 kB)Collecting requestsDownloading requests-2.34.2-py3-none-any.whl (73 kB)...Successfully installed certifi-2026.6.17 charset-normalizer-3.4.7 idna-3.18pyasn1-0.6.3 pyasn1-modules-0.4.2 pysnmp-7.1.27 requests-2.34.2 urllib3-2.7.0
验证依赖
python3.10 -c "import pysnmp, requests; print('依赖安装成功')"#输出:依赖安装成功
重新打包 Python 环境
cd /usr/localtar -czf /output/python310_full_arm64.tar.gz bin include lib sharels -lh /output/python310_full_arm64.tar.gz
输出:
-rw-r--r-- 1 root root 28M Jun 24 10:49 /output/python310_full_arm64.tar.gz注意:如果 /output 下已经有第一篇生成的同名文件,此操作会覆盖它。新文件包含了 Python 3.10 + 所有依赖。
exit打包前(/usr/local):├── bin/│ ├── python3.10 # Python 解释器│ └── pip3.10 # 包管理器└── lib/└── python3.10/└── site-packages/└── pip/ # 只有 pip打包后(pip install 之后):├── bin/│ ├── python3.10│ └── pip3.10└── lib/└── python3.10/└── site-packages/├── pip/├── pysnmp/ # ← 新增├── requests/ # ← 新增├── certifi/ # ← 新增├── idna/ # ← 新增├── pyasn1/ # ← 新增├── pyasn1_modules/ # ← 新增├── urllib3/ # ← 新增├── charset_normalizer/ # ← 新增└── ... # ← 全部依赖
如果你的使用场景是不想打包整个 Python 环境,只想下载依赖的 wheel 文件然后离线安装,也可以单独下载。
docker run --rm --platform linux/arm64 -v D:\wheels:/output python:3.10-slim bash -c "pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && pip download -d /output pysnmp requests certifi idna pyasn1-modules urllib3 charset-normalizer pyinstaller"三、在麒麟系统部署
3.1 麒麟上离线安装 wheel将下载好的 whl 文件夹拷贝到麒麟(如 /opt/wheels/),执行:
pip install --no-index --find-links=/opt/wheels pysnmp requests certifi idna pyasn1-modules pyinstallerpip 会自动解析依赖链,按正确顺序安装所有包。
将新的 python310_full_arm64.tar.gz 拷贝到麒麟:
# 1. 如果已有旧版本,先清理sudo rm -rf /opt/python310# 2. 创建目录并解压sudo mkdir -p /opt/python310sudo tar -xzf python310_full_arm64.tar.gz -C /opt/python310# 3. 创建软链接(可选)sudo ln -sf /opt/python310/bin/python3.10 /usr/local/bin/python3.10sudo ln -sf /opt/python310/bin/pip3.10 /usr/local/bin/pip3.10# 4. 验证 Pythonpython3.10 --version# 输出: Python 3.10.11# 5. 验证依赖python3.10 -c "import pysnmp, requests; print('依赖安装成功')"# 输出: 依赖安装成功
3.3 PyCharm 配置方法
在麒麟上安装了 Python 3.10 环境后,需要在 PyCharm 中配置项目使用该环境。
PyCharm → File → Settings → Project → Python Interpreter
点击右侧齿轮图标 → Add...
选择 Existing environment(现有环境)
浏览选择 /opt/python310/bin/python3.10
点击 OK,PyCharm 自动识别环境中所有依赖
⚠️ 注意:此方式下,在 PyCharm 中使用
pip install安装的新包会直接写入/opt/python310目录,影响该基础环境。如果多个项目共用此环境,可能造成依赖冲突。推荐使用方式二。
PyCharm → File → Settings → Project → Python Interpreter
点击右侧齿轮图标 → Add...
选择 New environment using → Virtualenv
Base interpreter 浏览选择 /opt/python310/bin/python3.10
✅ 勾选 "Inherit global site-packages"(继承全局包,关键步骤!)
点击 OK
⚠️ 注意:项目可以使用 /opt/python310 中已有的 pysnmp、requests 等依赖(通过继承)。项目新增的依赖安装在虚拟环境(venv)中,不会污染基础环境。不同项目可以有不同的依赖版本,互不干扰。
本文解决了纯 Python 依赖的打包问题。但项目中如果使用了 PyQt5 这类 C++ 扩展呢?PyQt5 官方从未发布 aarch64 的预编译 wheel,必须从源码编译。而且编译后的 .so 文件依赖 Qt5 运行时库,麒麟 V10 没有自带 Qt5,部署时还会遇到 undefined symbol 和 libmd4c.so.0: cannot open 等错误。下一篇将完整演示:在 Docker 中编译 PyQt5 + 打包 Qt5 运行时库及全部间接依赖,以及如何在麒麟上安全部署,不污染系统环境。
