Skip to main content

mihomo-py

面向 Linux 服务器的 mihomo CLI / TUI 客户端,可选 zashboard Web 面板,支持订阅管理、节点切换和延迟测试、配置校验、独立本机设置及后台进程管理。

需要 Python 3.11+、Linux(支持 pidfd 的内核,5.3+),支持 x86_64 / aarch64。支持系统 Python 和 Conda:Python 缺少原生 pidfd 接口时,通过标准库 ctypes 调用相同的 Linux 系统接口,不需要编译器或切换 Python;容器须允许这些系统调用。已用系统 Python 3.12.3、Conda Python 3.12.4、Textual 8.2.8、mihomo v1.19.19 验证(x86_64)。发行包内置 mihomo 内核与默认地理数据库;systemd 和 TUN 是后续阶段。

安装与开始使用

发行包发布并同步到所用镜像后,在当前 Python 环境(包括 Conda)中安装:

python -m pip install mihomo-py
mihomo-py

或使用独立虚拟环境:

uv venv --python /usr/bin/python3
uv pip install -e .
source .venv/bin/activate
mihomo-py                 # 进入 TUI,也可使用 mihomo-py tui

也可以使用子命令:

mihomo-py --help

# 导入本地完整的 Clash/Mihomo YAML 配置
mihomo-py sub add work ./config.yaml
mihomo-py sub use work
mihomo-py core start
mihomo-py core status
mihomo-py core logs --follow
mihomo-py core stop

在 TUI 的「设置」中填写代理监听地址,或使用 CLI:

mihomo-py config set --host 0.0.0.0

host 是代理监听 IPv4 地址,默认 127.0.0.1;0.0.0.0 允许通过本机各网络接口访问 HTTP/SOCKS 代理。管理 API / Web 面板由独立的 controller_host 设置控制,默认是 0.0.0.0。运行中修改会重启内核。

Web 面板

先安装可选资源:pip install 'mihomo-py[web]'(开发目录使用 pip install -e ./web 后 pip install -e '.[web]')。启动或重启内核后,在 TUI 点击「Web 面板」查看地址和登录密钥,或运行:

mihomo-py config set --controller-host 0.0.0.0 --controller-port 19090
mihomo-py --format table core web

其他设备打开 http://服务器IP:19090/ui/,在面板的 Password / 密码字段填写上述密钥并保存。例如:http://100.83.37.33:19090/ui/。0.0.0.0 是监听地址,浏览器使用服务器的实际 IP。修改代理 host 不会开放面板。

zashboard v3.29.1 的静态资源通过可选资源包提供,使用系统字体,不需要 GitHub、CDN 或额外 Web 服务。页面请求限制到当前内核地址,关闭默认更新、外部 IP 和连通性检查。密钥不会出现在网页资源或普通状态输出中,重启后保持有效;core web 输出包含密钥,请勿分享。设置 0.0.0.0 会同时开放带密钥验证的管理 API,请在可信网络访问。

Web 面板管理当前内核的节点、规则、流量和连接。需要浏览器订阅管理时,运行 mihomo-py web serve --port 19091,访问 http://服务器IP:19091/;该入口支持添加、更新、修改来源、切换、删除订阅以及启动 / 停止内核,与 TUI/CLI 共用配置和密钥。详见 Web 订阅管理 和 节点面板。

安装只需要可用的 pip 镜像源:内核和默认 GEO 数据已包含在 wheel / 源码发行包中,安装、构建和首次准备这些资源不访问 GitHub 或其他下载站。镜像需要同步本项目的发行包及 Python 依赖;安装 [web] 时还需要 mihomo-py-web 资源包。默认使用包内内核;如需覆盖,设置 MIHOMO_PY_BINARY=/path/to/mihomo 或使用全局选项 --core-binary(显式传入 mihomo 才会查找 PATH)。

远程订阅、自定义 geox-url、远程 rule/proxy providers 不属于内置资源,仍需可达或提前提供本地文件。默认 GEO 自动更新关闭,避免启动后触发外网更新。详见 离线安装与发行。

远程订阅支持 HTTP(S)。可以从 stdin 输入地址,避免把令牌放进命令历史:

read -rs 'SUB_URL?订阅 URL: '
printf '%s\n' "$SUB_URL" | mihomo-py sub add work -
unset SUB_URL

上例使用 zsh 的 read 语法;bash 可使用 read -rs -p '订阅 URL: ' SUB_URL。 也可以直接 mihomo-py sub add work 'https://example.com/sub?token=…'。 支持完整 YAML 配置,不转换 Base64 节点列表或 ss:// 等单节点链接。

终端界面

在交互终端直接运行 mihomo-py,或显式执行 mihomo-py tui。界面采用克制的深色设计,自适应常见终端尺寸;建议至少 80×24,支持鼠标、键盘与 NO_COLOR。

  • 订阅:添加、使用、更新、更换来源及确认删除,提供表单校验和下载 / 校验进度。
  • 节点:选择代理组、搜索、切换手动组节点及单节点测速;刷新保留列表阅读位置。
  • 日志:最近 200 行,支持自动跟随、暂停阅读和恢复跟随。

1/2/3 切页,/ 搜索节点,i 查看详情,? 查看快捷键,Ctrl-R 刷新,Ctrl-A 添加订阅。输入框保留原生编辑快捷键。打开界面不会自动启动内核,退出会保留运行中的内核。

完整操作与错误处理说明见 终端界面文档,其他文档见 文档导航。

命令

全局选项放在子命令前,例如 mihomo-py --json sub list。

命令 行为
tui 打开交互终端界面
sub add NAME SOURCE 读取来源、内核校验成功后保存;不会自动选择或启动
sub list 显示当前选择、来源和更新时间;隐藏 URL 路径及令牌
sub set NAME SOURCE 修改来源并刷新缓存;失败保留旧来源和配置
sub update [NAME] 重新读取来源;省略名称时更新当前订阅
sub use NAME 选择已缓存订阅;运行中则校验并重启,停止时只保存选择
sub remove NAME --yes 删除订阅记录和缓存原文;不能删除运行中的订阅
config show 查看本机设置
config set --proxy-port 17897 --controller-port 19090 --mode rule 修改设置;运行中自动重启生效
core start 从当前缓存后台启动;已健康运行则不重复启动
core restart 校验后重启;不刷新订阅
core stop 停止本实例;重复执行安全
core status 显示 PID、健康状态、已选订阅、实际运行订阅和设置
core logs [--lines 100] [--follow] 查看内核日志
core web 显示面板地址和登录密钥,须安装 [web]
web serve 前台运行 Web 订阅管理与节点统一入口,默认 0.0.0.0:9091
web secret 查看 Web/API 登录密钥,内核停止时也可用
node list [--group GROUP] 列出代理组,或指定组的节点、选择和最近延迟
node use NAME --group GROUP 按完整名称切换手动组节点,无需重启
node test NAME [--url URL] [--timeout-ms 5000] 测量一个节点的 HTTP 延迟,默认超时 5 秒

所有修改命令支持 --dry-run,输出 JSON 操作计划,退出码为 10。它不下载、不校验内核配置、不创建目录,因此只表示操作意图,不保证实际执行成功。终端删除会询问确认;管道中必须明确传入 --yes。

配置与数据

默认目录为 ${XDG_CONFIG_HOME:-~/.config}/mihomo-py;空或相对路径的 XDG_CONFIG_HOME 使用 ~/.config。可通过 MIHOMO_PY_HOME 或 --data-dir 覆盖。

state.json        # 订阅来源、缓存 YAML 原文、当前选择、本机设置(原子替换)
runtime.yaml      # 由缓存原文与本机设置生成的实际配置
process.json      # PID、Linux 启动标识、命令行、实际运行设置
controller-secret # 持久化的管理 / Web 登录密钥(0600)
core.log          # 内核日志,追加写入
validation.log    # 最近一次内核校验失败或超时的详细输出
geodata/          # 可选:手动放置离线地理数据库,供新订阅复制使用
core-data/        # 按订阅隔离的内核数据、provider 和节点选择缓存

目录默认权限 0700;客户端写入的状态、配置和日志文件为 0600。缓存包含订阅凭证,列举订阅时仅展示脱敏地址。

本机设置默认代理监听地址 127.0.0.1、代理端口 7897、管理端口 9090、路由模式 rule。模式可选 rule/global/direct。HTTP/SOCKS 共用代理端口,监听地址由本机 host 设置决定;管理接口由 controller_host 控制,默认监听 0.0.0.0,使用持久化的随机密钥;安装 [web] 后提供面板。当前固定禁用订阅携带的其他入站端口、自定义 listeners/tunnels、TUN、DNS/DoH 监听、iptables 接管、NTP 及订阅指定的外部 UI,保留节点、代理组、规则、DNS 解析配置,并启用节点选择缓存。代理端口不启用用户名密码验证。后续阶段再提供显式的入站和网络接管配置。

订阅原文不会被本机设置改写;更新后重新合成运行配置。下载默认直连,不使用 HTTP_PROXY/HTTPS_PROXY;上限 8 MiB、网络操作超时 20 秒。HTTPS 连接在 TCP 或 TLS 失败时尝试域名的其他地址,每个连接/握手阶段最多等待 5 秒,地址尝试共用 20 秒预算;始终校验证书与原始域名。订阅下载超时自动重试一次,并在 TUI 中提示。使用 mihomo -t 校验合成配置;默认 GEO 数据由包内资源提供;订阅自定义的数据和规则源仍可能触发下载。内核校验/启动超时可用全局 --timeout 60 调整。

校验前会将缺少的地理数据库从本客户端的 geodata/、已有 mihomo 的数据目录(通常为 ~/.config/mihomo)、包内快照按此优先级复制到订阅目录。支持 MMDB(country.mmdb / geoip.db / geoip.metadb)、geoip.dat、geosite.dat、ASN.mmdb,文件名不区分大小写。可用 MIHOMO_PY_GEODATA_DIR=/path/to/geodata 显式指定唯一来源,也可用它提供自定义 geox-url 对应的离线数据。只复制这些数据库,不复制订阅、provider 或节点选择缓存;保留目标已有有效文件。订阅显式配置 geox-url 时,相应数据库不会被默认快照替代。空文件和无效 MMDB 会被剔除后重新准备,最终由真实内核校验。校验超时请查看 validation.log,并检查自定义资源是否可达。

已有残缺 MMDB 的恢复、校验失败回滚和自定义来源隔离见 地理数据说明。

相对的 provider/规则/GEO 文件路径以对应的 core-data/<订阅标识>/ 为基准,导入本地 YAML 不会复制其旁边的依赖文件。建议使用内嵌节点/规则或远程 providers。sub remove 删除缓存原文和来源,但保留内核派生数据及历史日志,便于排错。

运行中更新、切换订阅或修改本机设置会短暂中断连接:校验成功后重启;新实例启动失败时尝试恢复旧实例,失败则明确报告。状态文件在成功启动后提交;普通启动失败保留旧订阅记录。文件内容先 fsync,再通过 rename 原子替换;不承诺目录项在断电后的持久化。进程和文件无法形成跨资源原子事务,断电或强制终止仍可能使运行状态与选择不同;core status 分别展示两者,core start 重新应用已保存选择。

进程管理核对 PID、启动时间、启动标识及命令行,并通过 pidfd 发送信号;不使用 pkill。不同 --data-dir 可运行独立实例,但必须设置不同端口。默认不配置 systemd,也不修改 shell 代理环境。

脚本与错误处理

子命令在交互终端默认表格/文本,管道默认 JSON;可显式 --format table 或 --json。不带子命令时,交互终端进入 TUI,管道或显式指定输出格式时输出状态;tui 子命令要求交互终端。数据写 stdout,结构化错误写 stderr;普通子命令输出无 ANSI 色码。日志可能包含内核返回的地址,core logs --follow 在 JSON 模式下逐行输出 NDJSON。

mihomo-py --json sub list
mihomo-py --json core status
mihomo-py config set --mode direct --dry-run
退出码 含义
0 成功
1 IO、下载、启动或其他运行错误
2 参数或配置错误
3 订阅、内核或日志不存在
4 权限不足
5 已存在、资源使用中、端口冲突或并发修改
10 已输出 dry-run 计划,未执行
130 用户取消

失败示例:{"error":"not_found","message":"…","suggestion":"…","retryable":false}。--help 与 --version 始终输出文本。

开发与验证

pip install -e ./web -e '.[dev,web]'
pytest
ruff check .
python -m build --installer uv

真实内核测试默认使用包内 mihomo(也支持 MIHOMO_TEST_BINARY);使用临时目录、空闲端口、直连规则和本地 HTTP 测速目标,不读取现有订阅,不访问机场服务,不改变现有代理。覆盖真实节点 API、选择持久化、TUI 订阅/内核/节点交互,以及 PTY 中的默认入口和退出。发行包验证必须运行真实内核测试。

本地 TLS 下载回归测试需要 openssl 命令来生成临时测试证书;运行客户端本身无需此命令。

配置字段参考 mihomo 全局配置。

文档目录见 docs/README.md。

Metadata

Release files for mihomo-py 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mihomo-py 0.1.4
File Size Uploaded
mihomo_py-0.1.4.tar.gz 39.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for mihomo-py 0.1.4
File Interpreter ABI Platform
mihomo_py-0.1.4-py3-none-manylinux_2_17_x86_64.musllinux_1_2_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64, Linux musl 1.2+ x86-64 Details
mihomo_py-0.1.4-py3-none-manylinux_2_17_aarch64.musllinux_1_2_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64, Linux musl 1.2+ ARM64 Details

Total release size: 95.0 MB

Release files / mihomo_py-0.1.4.tar.gz

Download URL mihomo_py-0.1.4.tar.gz
Size 39.7 MB
Tags Source
SHA-256 checksum
How to use checksums
70d7387e48942da8c6df8f4152aa734692538aef8c33233cb8972b45ae529ba4
BLAKE2b-256 checksum
How to use checksums
1dd13170db515227e36c6b2149e4bd56a756433a56667222d5fbf27fc900a5d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mihomo_py-0.1.4-py3-none-manylinux_2_17_x86_64.musllinux_1_2_x86_64.whl

Download URL mihomo_py-0.1.4-py3-none-manylinux_2_17_x86_64.musllinux_1_2_x86_64.whl
Size 28.3 MB
Tags Linux glibc 2.17+ x86-64 Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
e54a4a7a66a35269bc076238069d4f1adb60260c8d15e8eea7882ec67a1e466b
BLAKE2b-256 checksum
How to use checksums
88ffaf5e23f504f561fefcda812ee6ba10013725a5e69db7d66196ac7ee7face
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / mihomo_py-0.1.4-py3-none-manylinux_2_17_aarch64.musllinux_1_2_aarch64.whl

Download URL mihomo_py-0.1.4-py3-none-manylinux_2_17_aarch64.musllinux_1_2_aarch64.whl
Size 27.0 MB
Tags Linux glibc 2.17+ ARM64 Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
bd52424ac6ad351174452c77e326ec07ee3dee9355c218dd5cde6302a92cfe09
BLAKE2b-256 checksum
How to use checksums
881ea70b44181830988a07e59d26ee82315324c3603e9af7af9c0e8c6b58caf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.1.5

3 release files

This release

0.1.4 This release

3 release files

0.1.3

3 release files

0.1.2

3 release files

0.1.1

3 release files

0.1.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page