以实时语音转文字项目为例,介绍一下如何手动部署python应用到Linux服务器(附脚本)
Python模型的训练微调这里不说了,模型的集成使用也不说了,这里只说代码写好之后怎么部署。因为我之前是主要写java,对项目和项目结构比较看重,我就不太理解python 怎么在linux里部署使用的,本文重点介绍这一块。
Python代码一般是引擎层,相当于直接提供某种能力,可以以HTTP API的形式提供服务,也可以以RPC的方式提供服务,这个就看内部技术选型不提了。
一般来说,每一个python程序都会用一venv包装起来运行,用于隔绝不同应用到的依赖包之类的,然后应用程序直接在这个虚拟环境中启动即可。
所以运行Python程序大致分为三步
1. 本地确定程序的依赖版本
2. 构件虚拟运行环境
3.在虚拟环境启动应用
1. 本地确定程序的依赖版本
在py程序的目录运行命令
pip freeze > requirements.txt
然后把这个requirements.txt文件和py代码一起上传至指定的linux目录
2. 构件虚拟运行环境
现在我提供一个脚本,主要作用是创建虚拟环境并安装指定的依赖
#!/usr/bin/env bash
# 创建虚拟环境并安装依赖
# 用法:bash setup_model_env.sh /abs/path/venv /abs/path/requirements.txtset -e# ---------- 参数检查 ----------
if [ "$#" -ne 2 ]; thenecho "Usage: $0 <venv_dir> <requirements.txt>"exit 1
fiVENV_DIR=$1
REQUIREMENTS_FILE=$2
LOG_FILE="${VENV_DIR}/install.log"mkdir -p "$VENV_DIR"
echo "VENV_DIR: $VENV_DIR" | tee "$LOG_FILE"
echo "REQUIREMENTS_FILE: $REQUIREMENTS_FILE" | tee -a "$LOG_FILE"[ -f "$REQUIREMENTS_FILE" ] || { echo "Error: $REQUIREMENTS_FILE not found!"; exit 1; }# ---------- 1. 创建虚拟环境 ----------
echo "[1/3] Creating virtual environment..." | tee -a "$LOG_FILE"
# 用绝对路径避免“python3.11”指向错误解释器
PYTHON_EXEC="/usr/local/python-3.11/bin/python3.11"
"$PYTHON_EXEC" -m venv "$VENV_DIR" || {echo "Failed to create venv. Check $LOG_FILE" | tee -a "$LOG_FILE"exit 1
}# ---------- 2. 升级 pip ----------
echo "[2/3] Upgrading pip..." | tee -a "$LOG_FILE"
source "${VENV_DIR}/bin/activate"
"${VENV_DIR}/bin/python" -c "import ssl, sys; print('Interpreter:', sys.executable); print('SSL:', ssl.OPENSSL_VERSION)" | tee -a "$LOG_FILE""${VENV_DIR}/bin/pip" install --upgrade pip wheel \-i https://pypi.tuna.tsinghua.edu.cn/simple \--trusted-host pypi.tuna.tsinghua.edu.cn >> "$LOG_FILE" 2>&1 || {echo "Failed to upgrade pip. Check $LOG_FILE" | tee -a "$LOG_FILE"exit 1
}# ---------- 3. 安装依赖 ----------
echo "[3/3] Installing requirements..." | tee -a "$LOG_FILE"
pip install -r "$REQUIREMENTS_FILE" \-i https://pypi.tuna.tsinghua.edu.cn/simple \--trusted-host pypi.tuna.tsinghua.edu.cn >> "$LOG_FILE" 2>&1 || {echo "Failed to install deps. Check $LOG_FILE" | tee -a "$LOG_FILE"exit 1
}# ---------- 4. 验证 ----------
echo "===== Verifying key packages =====" | tee -a "$LOG_FILE"
pip freeze | grep -E 'torch|transformers|funasr' | tee -a "$LOG_FILE"echo "===== Done! =====" | tee -a "$LOG_FILE"
echo "Activate: source ${VENV_DIR}/bin/activate"
3.在虚拟环境启动应用
现在我将再提供一个脚本,用于运行py程序。你只要在运行第二步的程序之后在适当修改本脚本的配置部分,然后就能在虚拟环境启动对应的Python应用啦!
age: ./speech_server.sh start|stop|restart|statusVENV_DIR="/root/server/real_time_text/py"
PYTHON_EXEC="${VENV_DIR}/bin/python3.11"
SERVER_SCRIPT="${VENV_DIR}/speech_server4.py"
PID_FILE="${VENV_DIR}/speech_server.pid"
LOG_FILE="${VENV_DIR}/speech_server.log"start() {if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; thenecho "speech_server is already running (PID $(cat "$PID_FILE"))"return 1fiecho "Starting speech_server ..."source "${VENV_DIR}/bin/activate"nohup "$PYTHON_EXEC" "$SERVER_SCRIPT" >> "$LOG_FILE" 2>&1 &echo $! > "$PID_FILE"echo "Started (PID $!)"
}stop() {if [[ ! -f "$PID_FILE" ]]; thenecho "speech_server not running"return 1fiPID=$(cat "$PID_FILE")if kill -0 "$PID" 2>/dev/null; thenecho "Stopping speech_server (PID $PID) ..."kill "$PID"rm -f "$PID_FILE"echo "Stopped"elseecho "speech_server already dead, cleaning pid file"rm -f "$PID_FILE"fi
}status() {if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; thenecho "speech_server is running (PID $(cat "$PID_FILE"))"elseecho "speech_server is not running"[[ -f "$PID_FILE" ]] && rm -f "$PID_FILE"fi
}case "$1" instart) start ;;stop) stop ;;restart) stop; sleep 2; start ;;status) status ;;*) echo "Usage: $0 {start|stop|restart|status}" ;;
esac
后续还有一个可选的操作,就是使用systemd对应用进行管理,可以快速启动、开机自动启动应用程序,类似于mysql和nginx等等。