当前位置: 首页 > ops >正文

以实时语音转文字项目为例,介绍一下如何手动部署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等等。

http://www.xdnf.cn/news/16260.html

相关文章:

  • C++:STL中vector的使用和模拟实现
  • 【机器学习-1】特征工程与KNN分类算法
  • CPU(中央处理器)和GPU(图形处理器)的区别
  • 如何理解泊松分布
  • adb 下载并安装
  • 第七章 愿景11 琦琦复盘测试
  • 线段树学习笔记 - 练习题(3)
  • Effective C++ 条款02:尽量以 const, enum, inline 替换 #define
  • 【PyTorch】图像多分类项目部署
  • epoll_event数据结构及使用案例详解
  • 解密负载均衡:如何轻松提升业务性能
  • Qt:qRegisterMetaType函数使用介绍
  • iOS —— 天气预报仿写总结
  • 【日志】unity俄罗斯方块——边界限制检测
  • Zookeeper学习专栏(十):核心流程剖析之服务启动、请求处理与选举协议
  • Java测试题(上)
  • 《设计模式之禅》笔记摘录 - 10.装饰模式
  • gig-gitignore工具实战开发(四):使用ai辅助生成gitignore
  • AI图像编辑能力评测的8大测评集
  • ComfyUI中运行Wan 2.1工作流,电影级视频,兼容Mac, Windows
  • Elasticsearch-9.0.4安装教程
  • 05.原型模式:从影分身术到细胞分裂的编程艺术
  • RAG、Function Call、MCP技术笔记
  • 1 51单片机-C51语法
  • 免模型控制
  • Android Camera setRepeatingRequest
  • c语言-数据结构-沿顺相同树解决对称二叉树问题的两种思路
  • 算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地
  • KNN算法
  • 构建敏捷运营中枢:打通流程、部署与可视化的智能引擎