PsLauncher – 轻量级多脚本系统托盘管理器
在一个轻量化的, 类似于vscode的界面中, 通过多标签页统一管理并运行PowerShell/Bash/cmd(Batch)脚本, 支持系统托盘常驻、子进程强杀、ANSI着色的终端输出, 像终端一样的交互式输入输出. 专为本地大模型部署(llama.cpp/litellm)等场景优化.
NGC13009/PsLauncher.git
开发动机与应用场景:
我想在自己电脑上本地运行大模型, 并且一直使用ollama. 偶然, 我发现相较于llama.cpp, ollama总是占用更多的显存, 因此我决定使用llama.cpp作为本地大模型部署后端(不可思议,因为ollama其实也是llama.cpp套了一层而已). 但是llama.cpp自身不支持多进程, 什么都得手工管理. 因此我考虑能不能自己造一个ollama类似的玩意帮我管理的更好一些.
我在之前写过一个项目: ollama-launcher. 它的目的就是纯粹的一个后端管理软件, 并且要求轻量化且迅速. 因此我考虑能不能搞一个类似的东西去实现我的需求?
调研后, 我发现litellm是一个非常好的东西, 轻量化并且启动迅速, 这使得我没必要自己做一个网关去集散不同llama.cpp后端, 方便多了. 而且它不仅能管理本地模型并提供统一接口api, 而且还能把要钱的api也放到一起, 像是openrouter一样十分省事. 这样就不用来回配置多个程序的api了.
最开始, 我直接使用PowerShell的多个标签页, 通过启动写好配置的PowerShell脚本来手工启动litellm以及多个模型的llama.cpp. 我可以手工管理GGUF模型文件, 我觉得这无妨. 因此这个方案其实就能用了.
但是启动几个终端实在是不方便并且不够优雅, 并且我无法很方便的把他们扔到托盘后台去. 因此, 整合一下我们的目的….就诞生了这个程序.
ps: 如果你好奇这个过程的具体方式, 请参考如何使用PsLauncher自定义的配置本地大模型服务
核心亮点
- 多类型脚本统一管理:支持PowerShell(.ps1)/Bash(.sh)/Batch(.bat), 支持多文件夹扫描且不递归子目录, 记忆配置文件. 让你方便的在一处管理你常用的脚本.
- 类VSCode多标签体验:源码查看与脚本运行输出分标签管理, 支持语法高亮、ANSI着色.
- 全生命周期进程控制:一键启动/中止脚本, 强杀所有关联子进程, 无残留进程.
- 系统托盘常驻:一键隐藏到托盘, 后台不占窗口, 随时唤起使用.
- 交互式终端支持:运行标签页支持实时输入, 适配交互式脚本.
- 个性化界面定制:支持暗色/亮色主题切换, 字体大小/DPI缩放自由调节.
解决的痛点
- 比如本地部署llama.cpp、litellm等工具时, 多个脚本散落在不同文件夹, 每次运行要反复切换目录、找文件
- 或者同时启动多个服务时, 终端窗口混乱, 无法统一管理&中止
- 一些项目的自动化脚本需要经常执行, 但是我就是运维, 我不想搞个IDE打开还得等几秒, 况且我的服务器不一定有足够的内存或者磁盘支持它.
- 只想简单管理运行脚本, 不想为了这个需求打开VSCode等重量级IDE
- 我的脚本运行时间长, 需要脚本工具后台常驻, 随时快速唤起执行, 不占用前台窗口资源, 也不会因为任务窗口分散我的注意力.
快速开始
安装
两种方式:
- 下载源代码并使用Python运行
- 下载编译好的exe并直接运行
源码使用
# 配置环境
git clone https://github.com/NGC13009/PsLauncher.git
cd PsLauncher
pip install -r ./requirements.txt
Windows编译好的exe
从release页面下载exe, 解压并双击运行即可. (或者命令行高级启动, 后面有详细说明)
启动
不管何种安装方式, 都有有两种启动方式:
- 编译后双击exe直接启动程序, 这会自动载入相关配置.
- 通过命令行启动程序(或者Python源代码), 这可以设定两个参数, 设定一次后程序会保存配置文件, 后续无需再次设置.
使用命令行:
--scale N 界面字体缩放因子(例如: 1.5, 相当于Windows上的DPI缩放150%)
--light 添加该参数以使用亮色主题(默认暗色)
例子:
# 编译后exe启动
PsLauncher.exe --scale 2.0 # 缩放200%
PsLauncher.exe --scale 1.5 --light # 亮色主题,缩放150%
# 源码启动
python PsLauncher.py --scale 1.5 --light # 缩放150%
使用
- 打开程序后,通过菜单栏「设置-添加脚本目录」,添加你的脚本存放文件夹(如llama.cpp、litellm所在目录)
- 左侧列表会自动扫描并分类展示目录下的所有脚本,点击即可在新标签页查看源码
- 选中脚本后点击「启动」,即可在新标签页运行脚本,查看实时输出,或进行交互式输入 (就像是真正的终端一样). 点击「中止」可一键停止所有相关进程
- 简单编辑当前脚本
- 多个标签页可以方便切换查看, 使用鼠标滚轮也可以滚动超出屏幕的多个标签页.
- 工具栏是可以挪动位置的
配置
你也可以手工修改配置文件.
- 程序支持 JSON 格式的配置文件, 用于保存用户指定的扫描路径、字体大小等配置.
- 配置文件默认路径为
config.json, 格式如下:
// PsLauncher 程序配置文件: 配置文件支持注释. 您可以在此手动添加要扫描的文件夹路径.
{
"folders": [
"C:/application/LLMexe/llama.cpp",
"C:/application/LLMexe/test_script",
"C:/application/LLMexe/litellm"
],
"font_scale": 1.5, // 界面字体缩放因子(例如:1.5相当于Windows上的DPI缩放150%)
"dark_mode": true // 是否启用暗色模式(默认true)
}
注意事项
- 如果需要源码执行, 请确保系统已安装 Python 3.x 和 Qt5/Qt6.
- 一些情况下, 程序可能运行时需要管理员权限(视脚本内容而定).
- (目前已知问题): 一些情况下终端字符着色似乎是错的
- (目前已知问题): 终端标签内, 在选中的时候无法使用
ctrl+c复制, 这会直接发送中断信号. 这可能是按下ctrl时会自动先捕获按键导致的. 如果需要复制内容, 请使用工具栏的按钮.
详细使用方法与功能说明
程序界面构成
PsLauncher 采用类 VSCode 的界面布局,主要分为以下几个区域:
- 菜单栏 – 位于窗口顶部,按功能分类组织所有操作
- 工具栏 – 菜单栏下方,提供常用功能的快捷按钮,支持拖动调整位置
- 左侧文件列表 – 资源管理器,显示已添加文件夹中的所有脚本文件
- 右侧标签页区域 – 主要工作区,支持多标签页切换查看和编辑
菜单栏功能详解
系统菜单
- 保存当前配置 (F2) – 立即保存当前配置到配置文件
- 隐藏窗口到系统托盘 (F10) – 将程序窗口隐藏到系统托盘,后台运行
文件菜单
- 添加文件夹路径 (F2) – 添加新的脚本文件夹到扫描列表
- 移除选中的文件夹路径 (F3) – 从扫描列表中移除选中的文件夹
编辑菜单
- 复制选定内容 (F11) – 复制当前焦点控件中选中的文本
- 粘贴 (F12) – 将剪贴板内容粘贴到当前焦点控件
- 复制标签页全部到剪贴板 – 复制当前标签页全部文本内容
- 编辑脚本源代码 (F4) – 进入/退出脚本编辑模式,支持保存更改
工具菜单
- 启动脚本 (F5) – 运行当前选中的脚本
- 终止脚本 (F6) – 停止当前标签页中运行的脚本
脚本管理菜单
- 新建路径 – 在选中文件夹下创建新文件夹
- 新建脚本 – 在选中文件夹中创建新脚本文件
- 重命名脚本 – 重命名选中的脚本文件
- 复制脚本 – 复制选中的脚本文件(可重命名)
- 移动脚本 – 将脚本移动到其他已添加的文件夹
- 删除脚本 – 永久删除选中的脚本文件(不经过回收站)
标签菜单
- 关闭所有源码标签页 (F8) – 关闭所有源代码查看标签页
- 关闭所有运行标签页 (F9) – 关闭所有终端运行标签页(会停止运行中的进程)
- 关闭所有标签页 – 关闭所有标签页,包括源码和终端标签
帮助菜单
- 帮助 (F1) – 打开帮助文档
- 关于 – 显示程序信息和版权信息
工具栏功能详解
工具栏按钮按功能分组,使用分隔符分隔:
窗口管理组
- 📌隐藏 – 隐藏窗口到系统托盘,悬浮提示:”隐藏窗口到系统托盘, 通过单击托盘图标即可恢复窗口”
脚本控制组
- ▶️运行 – 运行当前焦点标签页的脚本,悬浮提示:”运行当前焦点标签页的脚本”
- ⏹️中止 – 中止当前焦点标签页的脚本,悬浮提示:”中止当前焦点标签页的脚本”
文本操作组
- 📋复制 – 复制当前选中的文本到剪贴板,悬浮提示:”复制当前选中的文本到剪贴板”
- 📤粘贴 – 粘贴当前剪贴板内容到光标位置,悬浮提示:”粘贴当前剪贴板内容到光标位置”
- 📄复制全部 – 复制焦点标签页全部文本到剪贴板,悬浮提示:”复制焦点标签页全部文本到剪贴板”
编辑功能组
- ✏️快速编辑(💾保存) – 进入/退出编辑模式,保存脚本更改,悬浮提示:”进入/退出编辑模式,保存脚本更改”(编辑模式时变为”保存脚本更改”)
标签页管理组
- 🗑️关闭所有源码 – 关闭所有只读源代码查看标签页,悬浮提示:”关闭所有只读源代码查看标签页”
- 🚫中止所有终端 – 关闭所有终端标签页,包括运行中的以及已经结束的,悬浮提示:”关闭所有终端标签页, 包括运行中的以及已经结束的”
- 💥关闭所有标签 – 关闭所有标签,这会关闭所有源代码标签页,同时关闭所有终端标签页,如果终端内正在执行,那么将强制中止,悬浮提示:”关闭所有标签, 这会关闭所有源代码标签页, 同时关闭所有终端标签页, 如果终端内正在执行, 那么将强制中止. 可能导致执行中的程序或脚本不能正常退出.”
左侧文件列表功能
左侧文件列表(资源管理器)是脚本管理的主要入口:
单击操作
- 单击文件夹项:展开/折叠文件夹
- 单击脚本项:在右侧打开一个新的源码查看标签页,显示脚本源代码
文件类型支持
- 支持
.ps1(PowerShell脚本) - 支持
.bat、.cmd(批处理脚本) - 支持
.sh(Bash脚本)
- 支持
扫描规则
- 仅扫描已添加文件夹的根目录,不递归子目录
- 实时更新显示,添加/删除文件后可通过刷新菜单更新
右侧标签页功能
右侧区域采用多标签页设计,支持两种类型的标签页:
1. 源码查看标签页 (📝 前缀)
- 查看模式:默认只读模式,显示脚本源代码
- 支持语法高亮(PowerShell/Bash/Batch语法)
- 支持代码折叠(通过Ctrl+鼠标滚轮缩放)
- 暗色主题背景,类似VSCode风格
- 编辑模式:通过点击”✏️快速编辑”按钮进入
- 背景色变为深灰色以示区别
- 可修改脚本内容
- 编辑完成后点击”💾保存”保存更改
- 自动处理UTF-8/GBK编码 (可能也不是那么好用…)
2. 终端运行标签页 (🖥️ 前缀)
- ANSI着色支持:正确显示彩色终端输出
- 交互式输入:支持向运行中的进程输入命令
- 进程控制:
- 运行脚本:显示启动时间戳和脚本路径
- 中止脚本:强制终止进程及其所有子进程
- 进程结束:显示结束时间戳
终端交互式操作指南
终端标签页提供类似真实终端的交互体验:
键盘操作
- Enter/Return键:发送当前输入行的命令给进程
- Ctrl+C:发送中断信号给运行中的进程(强制中止)
- Ctrl+V:粘贴剪贴板内容到输入位置(不发送给进程)
- Backspace/Left键:限制在输入区域内删除/移动,不能修改历史输出
输入保护机制
- 输入区域和历史输出区域分离
- 用户只能在当前输入行内编辑
- 防止误操作修改已输出的历史内容
- 复制输出内容时,需使用工具栏的”复制”按钮
进程管理
- 启动进程:在新标签页中运行脚本,自动根据文件类型调用相应解释器
- 终止进程:强制终止进程树,确保无残留进程
- 进程状态:实时显示标准输出和标准错误流
- 异常处理:进程异常退出时显示相应提示
右键菜单
左侧文件树支持右键菜单操作, 右侧标签页也支持相应的右键操作.
系统托盘功能
托盘图标操作
- 单击托盘图标:恢复显示程序窗口
- 右键托盘图标:显示托盘菜单
托盘菜单功能
- 打开窗口:从托盘恢复显示程序
- 退出程序:安全退出程序(会先试图停止所有运行中的脚本)
托盘通知
- 隐藏到托盘时显示提示信息
- 程序状态变化时可通过托盘图标感知
快捷键汇总
| 快捷键 | 功能 | 说明 |
|---|---|---|
| F1 | 打开帮助 | 显示帮助文档 |
| F2 | 添加文件夹路径 | 添加新的脚本文件夹 |
| F3 | 移除文件夹路径 | 移除选中的文件夹 |
| F4 | 编辑/保存脚本 | 切换编辑模式或保存更改 |
| F5 | 启动脚本 | 运行当前选中的脚本 |
| F6 | 终止脚本 | 停止当前运行的脚本 |
| F8 | 关闭所有源码标签页 | 清理源代码查看标签 |
| F9 | 关闭所有运行标签页 | 清理终端运行标签 |
| F10 | 隐藏到系统托盘 | 最小化到托盘运行 |
| F11 | 复制选定内容 | 复制选中的文本 |
| F12 | 粘贴 | 粘贴剪贴板内容 |
| Ctrl+C | 中断进程 | 发送中断信号给运行中的进程 |
| Ctrl+V | 粘贴文本 | 粘贴到当前输入位置 |
使用流程示例
初始设置
- 启动程序
- 点击”文件”→”添加文件夹路径”或按F2
- 选择包含脚本的文件夹(如llama.cpp目录)
- 程序自动扫描该文件夹下的脚本文件
查看和编辑脚本
- 在左侧文件列表中单击脚本文件
- 右侧打开源码标签页显示代码
- 如需修改,点击”✏️快速编辑”按钮进入编辑模式
- 修改后点击”💾保存”保存更改
运行脚本
- 在左侧文件列表中单击脚本文件
- 点击工具栏”▶️运行”按钮或按F5
- 右侧打开终端标签页运行脚本
- 查看实时输出,可进行交互式输入
- 如需停止,点击”⏹️中止”按钮或按F6
多任务管理
- 可同时打开多个脚本查看源码
- 可同时运行多个脚本在不同标签页
- 使用鼠标滚轮滚动标签栏切换标签页
- 使用标签管理功能批量关闭标签页
后台运行
- 点击工具栏”📌隐藏”按钮或按F10
- 程序窗口隐藏到系统托盘
- 脚本继续在后台运行
- 单击托盘图标随时恢复窗口
常见问题解答
Q: 如何复制终端输出内容?
A: 使用工具栏的”📋复制”按钮复制选中文本,或使用”📄复制全部”复制整个标签页内容。注意:在终端标签页中直接按Ctrl+C会发送中断信号给进程。
Q: 编辑模式保存失败怎么办?
A: 可能是文件权限问题,请尝试以管理员权限运行程序,或检查文件是否被其他程序占用。
Q: 如何调整界面字体大小?
A: 通过命令行参数 --scale 启动程序,或在配置文件中修改 font_scale 值。
Q: 脚本运行后没有输出怎么办?
A: 检查脚本是否需要交互式输入,终端支持交互式操作,尝试在输入区域键入命令后按Enter键。
Q: 如何彻底删除脚本文件?
A: 使用”脚本管理”→”删除脚本”功能,注意此操作直接删除文件,不经过回收站。
开发信息与开发者须知
- 语言: Python 3.x
- GUI 框架: PyQt5 / PyQt6
- 脚本执行: PowerShell
- 语法高亮: 基于 PyQt 的语法分析模块
- ANSI 支持: 通过终端模拟器实现 ANSI 着色
编译方式
首先确保环境, 除了requirements.txt, 还需要pip install pyinstaller.
之后, 执行以下命令
pyinstaller -w ./PsLauncher.py -i ./logo.ico -y --distpath ./exe --paths ./
这个程序只有一个图标是媒体数据, 并且已经被处理为base64写死到源代码了, 因此不需要任何额外的资源配置操作, 直接编译即可.
AI 开发者须知
如果你是AI那尤其要好好看这里! 开发时应该尽可能:
- Ctrl+C: 在终端标签页中, 如果有文本被选中, 则复制选中文本到剪贴板;否则发送中断信号给运行中的进程.
- Ctrl+V: 总是粘贴剪贴板内容到当前焦点控件, 而不是发送给运行中的程序.
- 所有工具栏按钮的功能都在菜单栏中有对应的菜单项, 按功能分类组织:
- 工具栏按钮按功能分组, 使用分隔符分隔不同类型的功能:
- 保持代码风格和注释风格
- 尤其重要: 这是GUI程序, 测试必须且仅能由人类处理, 你如果是AI, 那么改好后进行简单的自动语法检查, 然后直接结束并提交给人类做进一步测试, 作为AI你无需执行完整程序, 因为你可能不具备GUI操作能力. 您作为AI有义务告知人类需要进行哪些测试或交互测试.
- 尤其重要: 如果你是AI, 那么永远不要尝试读取
source_ico.py, 这里面就一个base64编码的字符串叫icon_base64_data, 用于给程序提供图标. 读取它没有任何意义并且也会让你很累.
人类开发者须知
您作为人类, 有义务协助ai执行GUI功能测试. 请按照下面的检查清单逐一确认是否需要检查 (比如更改过相应的代码, 那么就得检查). 清单仅供参考, 如果有新的需求请注意随时添加:
- [x] 正常启动
- [x] 通过json配置更改界面缩放
- [x] 菜单栏功能依次检查正常
- [x] 工具栏功能依次检查正常
- [x] 工具栏拖动后位置正确
- [x] 资源管理器显示正常
- [x] 资源管理器右键菜单功能依次检查正常
- [x] 资源管理器: 复制, 新建, 删除等功能
- [x] 源代码标签正常
- [x] 源代码标签右键菜单
- [x] 源代码标签修改功能, 保存等
- [x] 多个源代码标签切换
- [x] 任务终端标签正常
- [x] 任务终端标签右键菜单
- [x] 任务终端标签修改功能, 保存等
- [x] 多个任务终端标签切换
- [x] 任务终端交互输入
- [x] 任务终端的中断功能
- [x] 任务终端: 子进程是否可以在关闭标签页时正常退出
- [x] 任务终端: 子进程是否可以在统一关闭标签页时正常退出
- [x] 任务终端: 子进程是否可以在退出整个程序时正常退出
- [x] 任务终端: 多个子进程相互不影响
- [x] 托盘: 可隐藏
- [x] 托盘: 可恢复
- [x] 托盘: 托盘提示正常
- [x] 托盘: 可退出且无残留子进程
- [x] 任务终端: 启动脚本后, 是从脚本路径运行的
检查完成后记得恢复检查框!
版权信息
NGC13009
GPLv3许可
