点击展开更新日志

2025

1202

【新增】源起
【新增】项目介绍

1206

【新增】封装打包

nexttime

会有些什么呢(❁´◡`❁)

源起

是因为在内网进行密码管理,密码多了管理起来不太方便,就算存本地小本本也要加密码(现在就是这么干的,存的excel)。总觉得用起来不方便,正好没事借助强大的 DeepSeek 写了个简单的密码管理器应用。

不得不说,免费版的 DS 在代码生成方面确实还是有点实力,第一版生成了基本架构和主要代码,第一次就跑通了,只是后面想按照预期调整、排错、打包费了比较久的时间(也就半个月吧。。)。加上上下文限制,每次换对话也要把代码全部上传一次,就有点烦。

最后在虚拟机上勉强构建完成之后,传输到目标机上却发现 glibc 版本不匹配,只能重新准备环境构建,兜兜转转又是1周的时间。最终选择了 Docker 容器的方式,以下操作步骤(依赖、脚本)都是经过实际重新执行的,应该不会有问题…吧?

项目介绍

项目需求

  • 开发语言:Python
  • 交互方式:GUI
  • 核心功能:
    • 添加密码
    • 修改密码
    • 删除密码
    • 查看密码
    • 支持MySQL数据库
  • 交付物:
    • arm64 架构 appimage

环境

  • 开发环境
    • 操作系统:Win11 x86_64
    • IDE:PyCharm2024.3.1
    • Python:3.12
    • QT:Qt6
    • AI:DeepSeek
  • 打包环境
    • 设备:Mac mini M4
    • CPU: arm64
    • 虚拟机:Debian11
    • Docker:arm64v8/debian:buster-slim

封装打包

为了安全性、便捷性,自然不可能写完之后就结束了,单是环境配置就不是一句话的事(pip:?),尤其对于内网环境,单文件版是最好的选择,因此项目的最终目标,必须是能够封装为独立文件,不依赖系统环境可运行。因内网环境是基于Debian的UOS20 arm64架构(glibc=2.28),因此我们选择打包为 appimage 包。

程序在pycharm中运行和打包后能够正常运行,中间还是存在区别,主要是对于静态资源的处理,加上对打包过程、原理的不熟悉,最好的方式就是先简单打包一版,以便进一步调试,因此,这里就优先选择打包为 x86_64 的 exe 程序,方便本地执行调试。

x86_64 exe

推荐使用 Python3.12 版本。

1
2
pip install -r requirements.txt
python3 build_exe.py

执行后会在当前项目根目录 dist 目录下生成exe。

arm64 appimage

这里需要根据目标系统 glibc 版本高低选择合适的 Pythonqt 版本。

Python3.12+Qt6

构建环境

  1. 使用 Parallel Desktop 安装 Debian12 + DE;

  2. 更新仓库源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vi /etc/apt/sources.list

    Types: deb
    URIs: http://mirrors.ustc.edu.cn/debian
    Suites: bullseye bullseye-updates
    Components: main contrib non-free
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

    Types: deb
    URIs: http://mirrors.ustc.edu.cn/debian-security
    Suites: bullseye-security
    Components: main contrib non-free
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
    1
    2
    apt update
    apt install vim
  3. 安装 Python12:似乎仓库就已经是了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    export http_proxy=http://127.0.0.1:7897
    export https_proxy=http://127.0.0.1:7897
    wget https://www/python.org/ftp/python/3.12.12/Python-3.12.12.tgz
    tar xf Python-3.12.12.tgz # 如果报错什么EOF,说明下载不完整,删除重下
    cd Python-3.12.12
    apt install build-essential openssl libssl-dev zlib1g-dev libreadline-dev libncursesw5-dev libgdbm-dev libbz2-dev libffi-dev liblzma-dev tk-dev uuid-dev
    make distclean # 如果重新安装了依赖执行这个后继续
    ./configure --enable-optimizations
    make
    make altinstall
  4. 创建编译环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mkdir ~/venv
    cd venv
    python3.12 -m venv build
    source build/bin/activate

    # requirements_linux.txt 检查三个PyQt6是否是6版本,不是直接修改为6即可
    apt install pkg-config default-libmysqlclient-dev qt6-base-dev qt6-tools-dev

    pip install -r requirements_linux.txt

  5. 安装依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    sudo apt install build-essential qt6-base-dev qt6-tools-dev-tools qt6-declarative-dev qt6-qpa-plugins

    # qmake
    find /usr -name "qmake*" # 查找 qmake路径,比如我的环境在 /usr/lib/qt6/bin/
    ## 创建符号链接
    sudo ln -sf /usr/lib/qt6/bin/qmake /usr/bin/qmake
    sudo ln -sf /usr/lib/qt6/bin/qmake6 /usr/bin/qmake6

    # PyQt6 无论如何编译安装都装不上,所用直接装的预编译包
    pip install --use-pep517 PyQt6 --only-binary :all: --no-cache-dir

    # qt6/plugins 如果运行报错根据实际路径修改打包脚本下 plugins 路径,注释不必要的路径
    ## 可能路径
    ## /usr/lib/aarch64-linux-gnu/qt6/plugins # 比如我的就在这里
    ## /usr/lib/arm-linux=gnueabihf/qt6/plugins
    ## /usr/lib/qt6/plugins
    ## /usr/local/lib/qt6/plugins
    ## /opt/qt6/plugins
  6. 构建

    1
    python build_arm64_qt6.py

Python3.7+Qt5

若不是目标系统 glibc 版本只有2.28,贸然升级得不偿失,因此只能寻求低版本构建方案。

除非不得已,极其不建议升级系统相关组件!!!

如果是 arm64,只推荐 Docker 构建,而且不要再使用venv创建环境,况且在Mac mini上,低版本 Linux(Debian10,RockyLinux8,CentOS7,ubuntu18甚至都无法启动安装程序);x86_64就很好说了,虚拟机或者 Docker 都可以。

  1. 安装 Docker 或 Docker Desktop

  2. 启动容器

    1
    docker run --name build -it -v /path/to/project:/data arm64v8/debian:buster-slim /bin/bash
  3. 修改镜像仓库:debian10 buster

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /etc/apt/sources.list

    deb https://mirrors.aliyun.com/debian-archive/debian buster main contrib non-free
    # deb-src https://mirrors.aliyun.com/debian-archive/debian buster main contrib non-free
    deb https://mirrors.aliyun.com/debian-archive/debian-security buster/updates main contrib non-free
    # deb-src https://mirrors.aliyun.com/debian-archive/debian-security buster/updates main contrib non-free
    deb https://mirrors.aliyun.com/debian-archive/debian buster-updates main contrib non-free
    # deb-src https://mirrors.aliyun.com/debian-archive/debian buster-updates main contrib non-free

    apt update
  4. 准备构建环境

    1
    2
    3
    4
    5
    6
    apt install python3 python3-pip vim wget python3-pyqt5 pyqt5-dev qttools5-dev libmariadb-dev-compat libffi-dev libjpeg-dev 
    pip3 install --upgrade pip setuptools wheel


    # 删除 requirements.txt 中 PyQt5 三行,删除版本指定,由pip决定
    pip3 install -r requirements.txt
  5. 构建

    1
    python3 buile_arm64_qt5.py

构建成功会在当前项目目录下创建 PasswordManager-arm64.AppImage,传到桌面环境 arm64 Linux,添加执行权限验证。