PyArmor 实战指南:加密 Python 项目并跨机器运行的全流程解析
在 Python 应用加密与发布场景中,PyArmor 是一个非常实用的工具。它可以把 Python 脚本转换成难以反向工程的形式,同时提供运行时判断、授权许可等机制,非常适合用于保护商业逻辑。
本文将结合实践经验和官方行为说明,步骤化地讲解如何:
📌 在源机器加密 Python 项目
📌 确保加密后可以复制到其他机器并运行
📌 避免常见错误与坑
📌 配置与运行依赖环境
一、注意 Python 版本
当你在一台机器上加密了你的项目,然后把加密后的 dist 文件夹复制到另一台机器运行时,很容易遇到类似这样的错误:
首先需要在全局使用python 3.10.11版本,在源机器加密之后,如果想要copy 加密后的项目到另一个机器上运行,必须要保证另一台机器运行时使用的也是相同的python版本,否则会报错:
(.venv) PS C:\Users\Admin003\Desktop\dist> C:\Users\Admin003\AppData\Local\Programs\Python\Python310\python app_realtime.py
Traceback (most recent call last):
File "C:\Users\Admin003\Desktop\dist\app_realtime.py", line 2, in <module>
from pyarmor_runtime_000000 import __pyarmor__
File "C:\Users\Admin003\Desktop\dist\pyarmor_runtime_000000\__init__.py", line 2, in <module>
from .pyarmor_runtime import __pyarmor__
ImportError: DLL load failed while importing pyarmor_runtime: The specified module could not be found.这是因为 PyArmor 的运行时模块(pyarmor_runtime.pyd 等二进制扩展)依赖于特定版本的 Python 解释器和平台架构。它并不是一个纯 Python 文件,而是与 Python 内部 ABI 紧密绑定的二进制扩展。因此:
✔ 加密运行时一定要用 Python 3.10.11
✔ 目标机器也必须用 Python 3.10.11(且位数相同,如 x64)运行
✘ 否则就会出现 DLL 加载失败或 Marshal 序列化错误等异常
这是 PyArmor 官方文档明确指出的行为,因为运行时扩展包含平台和 Python 版本特定的信息,而不能跨版本运行。
换句话说:目标机器运行环境要与源机器尽可能一致,特别是Python版本,否则即使代码存在,动态库运行也会失败。
二、安装 PyArmor 与注意事项
在源机器上安装 PyArmor:
pip install pyarmor 这里安装的是 PyArmor 的免费版本。它对于小项目足够使用,但在加密大文件夹时可能会遇到如:out of license这类错误。这是因为试用版对一些复杂/大的目录结构有功能限制。
三、生成加密结果(指定 Python 版本)
对于windows,在项目根目录执行:
& "C:\Users\Hasee\AppData\Roaming\Python\Python310\Scripts\pyarmor.exe" generate --output dist .对于linux,在项目根目录执行:
pyarmor gen --recursive --output dist .这是推荐的命令形式,它指定了使用特定 Python 环境下的 pyarmor 工具,并且给出了输出目录。
执行结果会在当前目录下生成一个完整的 dist 目录,其中包含:
📌 加密后的脚本(*.py)
📌 支持运行的辅助文件与运行时扩展(runtime package)
📌 许可文件(license.lic)
📌 授权密钥文件(pytransform.key)
四、复制pytransform.py文件到 dist
pytransform.py 是 PyArmor 运行时的核心文件之一,必须放入 dist 目录。
对于windows:
Copy-Item -Force "C:\Users\Hasee\AppData\Roaming\Python\Python310\site-packages\pyarmor\pytransform.py" -Destination ".\dist\pytransform.py"对于linux:
cp -f \
/root/.pyenv/versions/3.10.11/lib/python3.10/site-packages/pyarmor/pytransform.py \
./dist/pytransform.py为什么需要它,设计到PyArmor 使用分层的运行时架构:
pyarmor_runtime.pyd :底层 DLL 负责核心解密逻辑
pytransform.py :上层 Python 接口,提供易用的 API
pyarmor_runtime_000000/__init__.py :初始化入口
这三个文件配合工作,才能确保加密后的代码在目标机器上正常运行。
如果不放入:
加密后的程序会抛出 ModuleNotFoundError: No module named 'pytransform' 或类似错误
无法正确加载和执行加密的 Python 模块
程序无法正常运行
五、dist 目录结构
最终的目录可能看起来像这样:
dist/
├── app_realtime.py
├── other_encrypted_scripts.py
├── pytransform.py
├── pytransform.key ← 可选:项目密钥文件
├── license.lic ← 可选:运行时许可证文件
└── pyarmor_runtime_000000/
├── __init__.py
└── pyarmor_runtime.pyd ← 加密运行时动态库5.1 pytransform.key:什么是它?什么时候需要?
5.1.1 作用
pytransform.key 是 项目级别的密钥文件,用于让运行时动态库和加密脚本一致:它包含了用于对字节码加密/解密的信息。
这是 PyArmor 生成的本地(项目)密钥,而不是全局的默认密钥。
5.1.2 全局密钥 vs 项目密钥
PyArmor 有两种密钥来源:
全局密钥箱(~/.pyarmor/.pyarmor_capsule.zip):这是默认的“密钥仓库”,如果你没有显式生成项目密钥,那么 PyArmor 使用的就是它里面的密钥进行加密。
项目密钥文件(pytransform.key):当你明确为某个项目生成专用密钥时,会得到这个文件。生成这个文件后,把它加到 dist 里可以让此 dist 包拥有自己的“独立密钥”,不再依赖全局密钥箱。
5.1.3 为什么没放它也能运行?
这是因为:如果没有本地的 pytransform.key,PyArmor 运行时 会回退去使用全局密钥箱中的密钥 来解密和执行代码。
运行时的查找顺序是:
当前目录下的
license.lic和pytransform.keypytransform.py所在目录里的这两个文件动态库内内嵌的默认许可/密钥
因此只要能找到可用的密钥和动态库,脚本是可以正常执行的。
5.1.4 什么时候才需要 pytransform.key?
建议显式生成和使用 pytransform.key 的场景:
为同一项目重复加密多个版本,确保版本之间密钥一致
多个客户需要不同授权许可 时,需要基于相同 project key 生成不同 license 文件
想离线管理每个项目的密钥,便于长期维护和控制
5.1.5 如何显式生成项目密钥文件?
用下面命令生成项目专用密钥:
pyarmor gen key --output keys
该命令会在当前目录的 keys/ 下生成一个 pytransform.key。
之后你可以复制到 dist:
Copy-Item keys\pytransform.key dist\
这样 dist 就带上了你自己项目的密钥,而不是依赖全局密钥箱。
5.2 license.lic:什么是它?什么时候需要它?
5.2.1 默认 license.lic 的作用
当你用 PyArmor 标准命令加密时,加密引擎会生成一个默认的 license.lic 放在 dist(以前版本是单独文件,现在一些版本甚至把它嵌入到了动态库里)。
这个默认 license.lic:
✔ 表示“允许加密脚本在任何机器上全部运行”
✔ 没有过期时间、没有设备绑定
✔ 是最宽松的许可
根据官方文档,在新版 PyArmor 中默认许可信息已经可以被嵌入动态库,因此 即使没有单独 license.lic 文件,脚本仍能运行。
5.2.2 自定义 license.lic 的意义
如果你希望对发布版做授权控制,则需要生成自定义的 license.lic:
🔸 设置使用期限(过期时间)
🔸 绑定特定机器(MAC、硬盘序列号)运行
🔸 限制只能在指定环境运行
这时就不能使用默认的“无限制许可证”,必须给客户一个单独的 license.lic。
5.1.3 如何生成自定义许可证?
PyArmor 提供命令来生成不同策略的许可证文件:
✨ 生成带过期时间的许可证
pyarmor licenses --expired 2025-12-31 myproj
执行后,会在类似:
licenses/myproj/license.lic
路径下生成一个新的许可证文件,可以拷贝到 dist:
Copy-Item licenses\myproj\license.lic dist\
✨ 生成绑定机器的许可证
pyarmor licenses --bind-disk "硬盘序列号" --bind-mac "MAC地址" myprojb
这个许可证只允许在该硬盘和该 MAC 的机器上运行。
官方文档说明:
加密后的脚本在运行时会先尝试在当前路径查找
license.lic和pytransform.key,
如果找不到,再去pytransform.py所在目录查找。
最后,如果没有这些文件也没有错误,那么运行时可能使用动态库内嵌的默认许可。
六、放入.env配置文件
将环境配置放入到dist目录,但是不能放入任何敏感信息,因为一旦运行时,所有的变量都是可获取的明文
七、安装项目依赖并运行
加密后的项目通常仍然需要依赖其他库(比如 Flask、aiohttp、mmpose 等),因此你需要在目标机器上:
创建虚拟环境:
python -m venv .venv激活虚拟环境:
C:\Code\Navtalk\Services\MuseTalk\.venv\Scripts\Activate.ps1安装依赖等等。
运行目标 Python 脚本:
python app_realtime.py这时:
✔ Python 会先加载 PyArmor 运行时扩展
✔ 再执行加密后的脚本逻辑
✔ 你得到与未加密版本相同的运行效果
安装python3.10.11:
# 1. 更新系统包
echo "\n1. 更新系统包..."
apt update -y
# 2. 检查并安装 Python 3.10.11
echo "\n2. 检查 Python 3.10.11 安装情况..."
PYTHON310_PATH=$(which python3.10 2>/dev/null)
REQUIRED_VERSION="3.10.11"
check_python_version() {
local python_path=$1
if [ -z "$python_path" ]; then
return 1
fi
local version=$($python_path --version 2>&1)
if [[ "$version" == *"$REQUIRED_VERSION"* ]]; then
return 0
else
return 1
fi
}
# 使用pyenv安装Python 3.10.11
install_python310_11_with_pyenv() {
echo "正在安装 pyenv..."
# 检查pyenv是否已安装
if [ -d "$HOME/.pyenv" ]; then
echo "✅ pyenv 已存在,跳过安装"
else
# 安装pyenv依赖
apt install -y \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses-dev \
tk-dev \
libffi-dev \
liblzma-dev
# 安装pyenv
curl https://pyenv.run | bash
fi
# 配置pyenv环境变量
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
echo "使用 pyenv 安装 Python $REQUIRED_VERSION ..."
# 检查Python是否已安装
if pyenv versions | grep -q "$REQUIRED_VERSION"; then
echo "✅ Python $REQUIRED_VERSION 已存在"
else
pyenv install $REQUIRED_VERSION
fi
# 验证安装
if pyenv versions | grep -q "$REQUIRED_VERSION"; then
echo "✅ Python $REQUIRED_VERSION 安装成功"
# 设置全局版本
pyenv global $REQUIRED_VERSION
echo "✅ 已设置pyenv全局Python版本为 $REQUIRED_VERSION"
# 将pyenv配置添加到.bashrc(当前用户登录shell)
if ! grep -q "pyenv init" ~/.bashrc 2>/dev/null; then
echo '' >> ~/.bashrc
echo '# Pyenv configuration' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
fi
# 直接修改系统的python和python3链接到pyenv版本
PYENV_PYTHON="$HOME/.pyenv/versions/$REQUIRED_VERSION/bin/python"
PYENV_PYTHON3="$HOME/.pyenv/versions/$REQUIRED_VERSION/bin/python3"
if [ -f "$PYENV_PYTHON" ]; then
# 备份原有链接
if [ -f /usr/bin/python ]; then
mv /usr/bin/python /usr/bin/python.system_backup 2>/dev/null || true
fi
if [ -f /usr/bin/python3 ]; then
mv /usr/bin/python3 /usr/bin/python3.system_backup 2>/dev/null || true
fi
# 创建新链接
ln -sf "$PYENV_PYTHON" /usr/bin/python
ln -sf "$PYENV_PYTHON3" /usr/bin/python3
echo "✅ 已将系统python链接更新为 $REQUIRED_VERSION"
fi
# 验证全局版本
echo "系统全局Python版本: $(python --version 2>&1)"
else
echo "❌ 错误: Python $REQUIRED_VERSION 安装失败"
exit 1
fi
}
# 从源码安装Python 3.10.11
install_python310_11_from_source() {
echo "正在从源码安装 Python $REQUIRED_VERSION ..."
# 安装编译依赖
apt install -y \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses5-dev \
libncursesw5-dev \
tk-dev \
libffi-dev \
liblzma-dev \
python3.10
# 下载Python源码
cd /tmp
if [ ! -f "Python-$REQUIRED_VERSION.tgz" ]; then
wget https://www.python.org/ftp/python/$REQUIRED_VERSION/Python-$REQUIRED_VERSION.tgz
fi
# 解压并编译
tar -xzf Python-$REQUIRED_VERSION.tgz
cd Python-$REQUIRED_VERSION
./configure --enable-optimizations --prefix=/usr/local
make -j$(nproc)
make altinstall
# 验证安装
if /usr/local/bin/python3.10 --version 2>&1 | grep -q "$REQUIRED_VERSION"; then
echo "✅ Python $REQUIRED_VERSION 源码安装成功"
else
echo "❌ 错误: Python $REQUIRED_VERSION 源码安装失败"
exit 1
fi
}
# 检查当前Python版本
if check_python_version "$PYTHON310_PATH"; then
echo "✅ Python $REQUIRED_VERSION 版本正确"
else
echo "⚠️ 当前 Python 版本不是 $REQUIRED_VERSION,项目要求使用 Python $REQUIRED_VERSION"
# 首先尝试使用apt安装指定版本
echo "尝试使用 apt 安装 Python $REQUIRED_VERSION ..."
apt install -y software-properties-common
# Fix add-apt-repository shebang if needed
if [ -f /usr/bin/add-apt-repository ]; then
# Check current shebang
CURRENT_SHEBANG=$(head -n 1 /usr/bin/add-apt-repository)
if [[ "$CURRENT_SHEBANG" == "#!/usr/bin/python3" ]]; then
# Backup the original script
cp /usr/bin/add-apt-repository /usr/bin/add-apt-repository.backup
# Change shebang to use the system Python directly (since apt_pkg is only in system Python)
sed -i '1s|#!/usr/bin/python3|#!/usr/bin/env python3.12|' /usr/bin/add-apt-repository
echo "✅ Fixed add-apt-repository shebang to use system Python 3.12"
fi
fi
add-apt-repository -y ppa:deadsnakes/ppa
apt update -y
if apt-cache policy python3.10 | grep -q "$REQUIRED_VERSION"; then
apt install -y \
python3.10="$REQUIRED_VERSION" \
python3.10-venv="$REQUIRED_VERSION" \
python3.10-dev="$REQUIRED_VERSION" \
python3.10-distutils="$REQUIRED_VERSION"
if check_python_version "python3.10"; then
echo "✅ Python $REQUIRED_VERSION 安装成功"
else
echo "❌ 错误: Python $REQUIRED_VERSION 安装验证失败"
exit 1
fi
else
echo "❌ 错误: apt 源中没有 Python $REQUIRED_VERSION"
echo "正在使用 pyenv 自动安装 Python $REQUIRED_VERSION ..."
install_python310_11_with_pyenv
fi
fi下载,安装,加密,验证完整命令:
#!/bin/bash
# ============================================
# 完整的 Pyarmor 安装、加密、验证脚本
# 使用 Python 3.10.11
# 输出到 /workspace/NavTalk/Services/MuseTalk/dist
# ============================================
# 移除 set -e,改为手动错误处理
# set -e # 遇到错误立即退出
# 错误处理函数
handle_error() {
echo "❌ 错误发生在: $1"
echo "退出码: $?"
exit 1
}
# 配置 pyenv 环境(添加错误检查)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
# 检查 pyenv 是否存在
if [ -d "$PYENV_ROOT" ]; then
# 初始化 pyenv(如果失败,继续执行,可能系统 Python 可用)
eval "$(pyenv init -)" 2>/dev/null || {
echo "⚠️ 警告: pyenv 初始化失败,将尝试使用系统 Python"
}
export PYENV_VERSION=3.10.11
else
echo "⚠️ 警告: pyenv 未安装,将尝试使用系统 Python"
fi
# 设置工作目录
WORK_DIR="/workspace/NavTalk/Services/MuseTalk"
ENCRYPTED_DIR="dist"
cd "$WORK_DIR" || handle_error "无法切换到工作目录: $WORK_DIR"
echo "=========================================="
echo "Pyarmor 完整流程:安装 -> 加密 -> 验证"
echo "=========================================="
echo "工作目录: $WORK_DIR"
echo "输出目录: $ENCRYPTED_DIR"
echo ""
# ============================================
# 第一部分:安装 Pyarmor
# ============================================
echo "=========================================="
echo "第一部分:安装 Pyarmor (Python 3.10.11)"
echo "=========================================="
# 1. 验证 Python 版本(添加容错)
echo ""
echo "1. 验证 Python 版本:"
# 尝试多种方式找到 Python 3.10
PYTHON_CMD=""
if command -v python3.10 &> /dev/null; then
PYTHON_CMD="python3.10"
elif command -v python3 &> /dev/null; then
PYTHON_VERSION_CHECK=$(python3 --version 2>&1)
if [[ "$PYTHON_VERSION_CHECK" == *"3.10"* ]]; then
PYTHON_CMD="python3"
fi
fi
if [ -z "$PYTHON_CMD" ]; then
echo " ❌ 未找到 Python 3.10"
echo " 尝试查找可用的 Python 版本..."
command -v python3 && python3 --version || true
command -v python && python --version || true
handle_error "需要 Python 3.10.11"
fi
PYTHON_VERSION=$($PYTHON_CMD --version 2>&1)
echo " 找到: $PYTHON_VERSION"
echo " 使用命令: $PYTHON_CMD"
if [[ ! "$PYTHON_VERSION" == *"3.10"* ]]; then
echo " ⚠️ 警告: Python 版本不是 3.10.x,但继续执行"
# 不退出,继续尝试
fi
# 2. 卸载可能存在的旧版本
echo ""
echo "2. 清理旧版本 pyarmor..."
$PYTHON_CMD -m pip uninstall -y pyarmor 2>/dev/null || true
echo " ✅ 清理完成"
# 3. 安装 pyarmor
echo ""
echo "3. 安装 pyarmor..."
if ! $PYTHON_CMD -m pip install --upgrade pyarmor; then
handle_error "pyarmor 安装失败"
fi
echo " ✅ pyarmor 安装完成"
# 4. 验证安装
echo ""
echo "4. 验证 pyarmor 安装:"
PYARMOR_PATH=$($PYTHON_CMD -c "import pyarmor; print(pyarmor.__file__)" 2>/dev/null)
if [ -z "$PYARMOR_PATH" ]; then
handle_error "pyarmor 安装失败!"
fi
echo " ✅ pyarmor 路径: $PYARMOR_PATH"
# 5. 检查并复制 pytransform.py(如果需要,先备份原 dist)
echo ""
echo "5. 准备加密目录..."
# 如果 dist 目录已存在,备份它
if [ -d "$ENCRYPTED_DIR" ]; then
echo " 发现已存在的 dist 目录,备份为 dist_backup_$(date +%Y%m%d_%H%M%S)..."
BACKUP_DIR="dist_backup_$(date +%Y%m%d_%H%M%S)"
mv "$ENCRYPTED_DIR" "$BACKUP_DIR" || handle_error "备份失败"
echo " ✅ 已备份到: $BACKUP_DIR"
fi
# 创建新的 dist 目录
mkdir -p "$ENCRYPTED_DIR" || handle_error "创建目录失败"
echo " ✅ dist 目录已准备"
# 6. 验证 pyarmor 命令
echo ""
echo "6. 验证 pyarmor 命令:"
if ! pyarmor --version; then
handle_error "pyarmor 命令不可用"
fi
echo " ✅ pyarmor 命令可用"
echo ""
echo "=========================================="
echo "第一部分完成:Pyarmor 安装成功"
echo "=========================================="
# ============================================
# 第二部分:加密文件
# ============================================
echo ""
echo "=========================================="
echo "第二部分:加密文件 (Python 3.10.11)"
echo "=========================================="
# 1. 准备加密
echo ""
echo "1. 准备加密..."
echo " 工作目录: $WORK_DIR"
echo " 输出目录: $ENCRYPTED_DIR"
# 2. 执行加密(直接输出到 dist 目录)
echo ""
echo "2. 开始加密..."
echo " 使用 Python: $($PYTHON_CMD --version)"
echo " 加密所有 .py 文件到 $ENCRYPTED_DIR 目录..."
# 加密当前目录的所有 .py 文件到 dist 目录
if ! pyarmor gen --recursive . -O "$ENCRYPTED_DIR"; then
handle_error "加密失败"
fi
echo ""
echo " ✅ 加密完成"
# 3. 复制 pytransform.py 到 dist 目录
echo ""
echo "3. 复制 pytransform.py 到 dist 目录..."
PYTRANSFORM_PATH=$($PYTHON_CMD -c "import pyarmor, os; print(os.path.join(os.path.dirname(pyarmor.__file__), 'pytransform.py'))" 2>/dev/null)
if [ -f "$PYTRANSFORM_PATH" ]; then
cp "$PYTRANSFORM_PATH" "$ENCRYPTED_DIR/pytransform.py" || echo " ⚠️ 复制 pytransform.py 失败(可能不需要)"
echo " ✅ pytransform.py 已复制"
else
echo " ⚠️ 未找到 pytransform.py(可能不需要)"
fi
# 4. 检查加密结果
echo ""
echo "4. 检查加密结果:"
if [ -d "$ENCRYPTED_DIR" ]; then
ENCRYPTED_COUNT=$(find "$ENCRYPTED_DIR" -name "*.py" 2>/dev/null | wc -l)
echo " ✅ 加密目录已创建: $ENCRYPTED_DIR"
echo " ✅ 加密文件数量: $ENCRYPTED_COUNT"
# 检查关键文件
if [ -f "$ENCRYPTED_DIR/pyarmor_runtime_000000/pyarmor_runtime.so" ]; then
echo " ✅ pyarmor_runtime.so 已生成"
else
echo " ⚠️ pyarmor_runtime.so 未找到(可能不是必需的)"
fi
else
handle_error "加密目录未创建,加密失败"
fi
echo ""
echo "=========================================="
echo "第二部分完成:文件加密成功"
echo "=========================================="
# ============================================
# 第三部分:验证加密结果(简化版,移除可能失败的命令)
# ============================================
echo ""
echo "=========================================="
echo "第三部分:验证加密结果"
echo "=========================================="
cd "$ENCRYPTED_DIR" || handle_error "无法切换到加密目录"
# 1. 检查文件结构
echo ""
echo "1. 检查文件结构:"
if [ -d "pyarmor_runtime_000000" ]; then
echo " pyarmor_runtime 目录:"
ls -lh pyarmor_runtime_000000/ 2>/dev/null | head -5 || true
else
echo " ⚠️ pyarmor_runtime_000000 目录不存在"
fi
echo ""
echo " 加密的 Python 文件(前5个):"
ls -lh *.py 2>/dev/null | head -5 || echo " 当前目录无 .py 文件"
# 2. 检查 pyarmor_runtime.so(如果存在)
echo ""
echo "2. 检查 pyarmor_runtime.so:"
if [ -f "pyarmor_runtime_000000/pyarmor_runtime.so" ]; then
echo " ✅ 文件存在"
ls -lh pyarmor_runtime_000000/pyarmor_runtime.so
# 检查文件类型(如果 file 命令可用)
if command -v file &> /dev/null; then
echo ""
echo " 文件类型:"
file pyarmor_runtime_000000/pyarmor_runtime.so 2>/dev/null || true
fi
# 检查依赖库(如果 ldd 命令可用)
if command -v ldd &> /dev/null; then
echo ""
echo " 依赖库:"
ldd pyarmor_runtime_000000/pyarmor_runtime.so 2>/dev/null | head -5 || echo " 无法读取依赖信息"
fi
else
echo " ⚠️ 文件不存在(可能不是必需的)"
fi
# 3. 检查加密信息
echo ""
echo "3. 检查加密信息:"
if [ -f "pyarmor_runtime_000000/__init__.py" ]; then
echo " 加密信息(从 __init__.py):"
head -1 pyarmor_runtime_000000/__init__.py 2>/dev/null || true
fi
# 4. 验证 Python 版本兼容性(简化,移除可能失败的测试)
echo ""
echo "4. 验证 Python 版本兼容性:"
echo " 测试 Python:"
$PYTHON_CMD -c "
import sys
print(f' Python 版本: {sys.version}')
print(' ✅ Python 可用')
" 2>&1 || echo " ⚠️ Python 测试失败"
# 5. 检查 .so 文件中的 Python 版本信息(如果文件存在且 strings 命令可用)
if [ -f "pyarmor_runtime_000000/pyarmor_runtime.so" ] && command -v strings &> /dev/null; then
echo ""
echo "5. 检查 .so 文件中的版本信息:"
strings pyarmor_runtime_000000/pyarmor_runtime.so 2>/dev/null | grep -E "python|3\.(10|12)" | head -5 || echo " 未找到明确的版本字符串"
fi
# 6. 最终验证总结
echo ""
echo "=========================================="
echo "验证总结"
echo "=========================================="
echo ""
echo "✅ 安装: Pyarmor 已安装"
echo "✅ 加密: 所有文件已加密"
echo "✅ 验证: 加密文件结构完整"
echo ""
echo "加密目录: $WORK_DIR/$ENCRYPTED_DIR"
echo "加密使用的 Python: $PYTHON_VERSION"
echo ""
echo "=========================================="
echo "所有步骤完成!"
echo "=========================================="拉取远程,删除,推送分支:
Linux:
#!/bin/bash
# 配置 Git、提交并推送(只推送 dist 目录)
cd /workspace/NavTalk/Services/MuseTalk/dist
echo "=========================================="
echo "配置 Git 并推送(仅 dist 目录)"
echo "=========================================="
# 0. 检查是否是 Git 仓库,如果不是则初始化
if [ ! -d ".git" ]; then
echo ""
echo "0. 初始化 Git 仓库..."
git init
echo " ✅ Git 仓库已初始化"
fi
# 1. 配置 Git 用户信息
echo ""
echo "1. 配置 Git 用户信息..."
git config user.email "19115561755@163.com"
git config user.name "gaoyaomiao"
echo " ✅ Git 用户信息已配置"
# 2. 配置 GitHub 认证(使用 Personal Access Token)
echo ""
echo "2. 配置 GitHub 认证..."
git remote remove origin 2>/dev/null || true
git remote add origin https://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@github.com/gym02/navtalk-5090-linux.git
echo " ✅ GitHub 认证已配置"
# 3. 创建或更新 .gitignore(排除 pyarmor_runtime.so)
echo ""
echo "3. 创建/更新 .gitignore..."
cat > .gitignore << 'EOF'
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
*.so
# 例外:不忽略 pyarmor_runtime.so(Pyarmor 加密必需)
!pyarmor_runtime_000000/pyarmor_runtime.so
*.egg
*.egg-info/
dist/
build/
EOF
echo " ✅ .gitignore 已创建/更新(已排除 pyarmor_runtime.so)"
# 4. 提交文件(只提交当前目录下的文件)
echo ""
echo "4. 提交文件..."
# 先添加所有文件
git add .
# 强制添加 pyarmor_runtime.so(确保被包含)
if [ -f "pyarmor_runtime_000000/pyarmor_runtime.so" ]; then
git add -f pyarmor_runtime_000000/pyarmor_runtime.so
echo " ✅ 已强制添加 pyarmor_runtime.so"
else
echo " ⚠️ 警告: pyarmor_runtime.so 文件不存在"
fi
# 检查状态,确认文件被添加
echo ""
echo " 检查 Git 状态..."
git status --short | grep pyarmor_runtime.so || echo " ⚠️ pyarmor_runtime.so 未在暂存区"
# 提交
git commit -m "Add encrypted files (Python 3.10.11) - $(date +%Y-%m-%d)" || echo " 没有新文件需要提交"
echo " ✅ 文件已提交"
# 5. 删除远程分支(如果存在)
echo ""
echo "5. 删除远程分支(如果存在)..."
git push origin --delete 2026-1-15 2>/dev/null || echo " 远程分支不存在,跳过"
# 6. 确保在正确的分支上
echo ""
echo "6. 检查当前分支..."
CURRENT_BRANCH=$(git branch --show-current 2>/dev/null || echo "master")
if [ "$CURRENT_BRANCH" != "2026-1-15" ]; then
echo " 当前分支: $CURRENT_BRANCH"
echo " 创建并切换到分支 2026-1-15..."
git checkout -b 2026-1-15
else
echo " 已在分支 2026-1-15"
fi
# 7. 推送到远程
echo ""
echo "7. 推送到远程..."
git push -u origin 2026-1-15 --force
echo ""
echo "=========================================="
echo "✅ 完成!"
echo "=========================================="
echo "分支: 2026-1-15"
echo "远程: https://github.com/gym02/navtalk-5090-linux.git"
echo "目录: /workspace/NavTalk/Services/MuseTalk/dist"Windows:
cd "D:\Code_git\navtalk\Services\MuseTalk\dist"
# 检查是否是 Git 仓库,若不是则初始化
if (-Not (Test-Path .git)) {
Write-Host "初始化 Git 仓库..."
git init
}
# 配置 Git 用户信息
git config user.email "19115561755@163.com"
git config user.name "gaoyaomiao"
# 配置 GitHub 远程仓库认证
git remote remove origin -ErrorAction SilentlyContinue
git remote add origin https://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@github.com/gym02/navtalk-5090-windows.git
# 创建或更新 .gitignore 文件
@"
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
*.so
!pyarmor_runtime_000000/pyarmor_runtime.so
*.egg
*.egg-info/
dist/
build/
"@ | Set-Content -Path .gitignore
# 提交文件(只提交当前目录下的文件)
git add .
# 强制添加 pyarmor_runtime.so(如果存在)
if (Test-Path "pyarmor_runtime_000000\pyarmor_runtime.so") {
git add -f "pyarmor_runtime_000000\pyarmor_runtime.so"
Write-Host "已强制添加 pyarmor_runtime.so"
} else {
Write-Host "警告: pyarmor_runtime.so 文件不存在"
}
# 提交更改
git commit -m "Add encrypted files (Python 3.10.11) - $(Get-Date -Format yyyy-MM-dd)"
# 检查并切换到 main 分支
$currentBranch = git rev-parse --abbrev-ref HEAD
if ($currentBranch -ne "main") {
Write-Host "当前分支: $currentBranch"
Write-Host "创建并切换到分支 main..."
git checkout -b main
} else {
Write-Host "已在分支 main"
}
# 强制推送到远程 main 分支
git push -u origin main --force
Write-Host "==========================================="
Write-Host "✅ 完成!"
Write-Host "==========================================="
Write-Host "分支: main"
Write-Host "远程: https://github.com/gym02/navtalk-5090-windows.git"
Write-Host "目录: D:\Code_git\navtalk\Services\MuseTalk\dist"服务器拉取,并切换分支:
# 切换到 2026-1-15 分支
git checkout 2026-1-15
# 拉取最新的远程分支信息
git fetch origin
# 重置本地分支到远程分支(丢弃本地更改)
git reset --hard origin/2026-1-15
# 验证
git status
- 感谢你赐予我前进的力量

