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

以实时语音转文字项目为例,介绍一下如何手动部署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.dtcms.com/a/299501.html

相关文章:

  • 根据ip获取地址库
  • 【Git】Git下载全攻略:从入门到精通
  • 如何在 Git 中控制某些文件不被提交?
  • 图解网络-小林coding笔记(持续更新)
  • 【2025最新】浏览器插件开发选型建议:WXT、Plasmo、原生TS/JS
  • 融合为体,AI为用:数据库在智能时代的破局之道
  • Maven之依赖管理
  • 《Java 程序设计》第 6 章 - 字符串
  • 智慧城市多目标追踪精度↑32%:陌讯动态融合算法实战解析
  • 【Canvas与旗帜】条纹版大明三辰旗
  • 神经网络中的反向传播原理:驱动智能的核心引擎
  • k8s:将打包好的 Kubernetes 集群镜像推送到Harbor私有镜像仓库
  • 电子电气架构 --- 高阶智能驾驶对E/E架构的新要求
  • Java操作Excel文档
  • Spring的深入浅出(6)--使用AOP的思想改造转账案例
  • 人形机器人指南(八)操作
  • 手动开发一个串口调试工具(二):Qt 串口类基本认识与使用
  • 基于 ThinkPHP 开发的垂直化网址导航
  • Linux进程地址空间:深入探索其结构与机制
  • 元宇宙新基建:重塑数字市场的“超大陆”边界
  • 【Android】内容提供器
  • 7️⃣ 递归函数
  • 【AcWing 835题解】滑动窗口
  • 数据结构 双向链表
  • greenhills编译出错问题
  • C++学习之深入学习模板(进阶)
  • SAPUI5 树形表格TreeTable示例
  • Spring AI(14)——文本分块优化
  • java之23种设计模式
  • 设计模式:Memento 模式详解