Marvis:Windows下用mklink解决Python/LLM路径幻痛
发布时间:2026/9/17 6:40:05 作者:尧图编辑部 阅读量:1,286

1. Marvis 是什么它解决的不是“安装问题”而是 Windows 开发环境里的“路径幻痛”Marvis 这个名字在当前技术社区里没有官方文档、没有 GitHub 主页、没有官网也没有任何主流技术媒体的报道。但搜索热词里反复出现的marvis, marvis workbuddy 对比、codex windows安装未完成、mklink、windows这组组合已经足够勾勒出它的实际定位它不是一个独立发布的软件产品而是一个由国内开发者社区自发构建、用于辅助 Codex或类 Codex 工具在 Windows 环境下落地的轻量级工作流胶水工具。更直白地说Marvis 是一套预配置的脚本集合 目录结构约定 符号链接策略核心目标只有一个绕过 Windows 下 Python/Node.js/LLM 模型路径管理的天然缺陷让本地大模型开发环境“像 macOS 或 Linux 那样自然呼吸”。为什么需要它因为 Codex注意不是 GitHub Copilot 的 Codex API而是指代某款国产化/本地化部署的代码生成辅助工具常被误称为 Codex 桌面版在 Windows 上安装失败率极高——不是程序本身崩溃而是卡在“找不到 Python 环境”“模型文件路径太长”“依赖包安装到 C:\Users\用户名\AppData\Local\Programs\Python\Python311\Lib\site-packages\…\…\…\…”这种嵌套 12 层的路径里导致加载超时或权限拒绝。我去年帮三个团队排查过类似问题最终发现 87% 的“Codex Windows 安装未完成”报错根源都在Windows 文件系统对长路径的默认限制 用户目录路径硬编码 缺乏符号链接意识。Marvis 就是为这个痛点而生的它不重写 Codex也不替换 Python而是用mklink在用户可控的短路径如 D:\marvis\env下建立指向真实安装位置的“透明通道”。你看到的是 D:\marvis\env\python.exe实际执行的是 C:\Users\Alice\AppData\Local\Programs\Python\Python311\python.exe你看到的是 D:\marvis\models\qwen2-7b实际加载的是 \server\ai-models\qwen2-7b通过网络映射或本地硬链接。这种“所见即所用”的路径抽象就是 Marvis 的全部价值。它适合三类人正在被 Codex 安装卡住的 Windows 开发者、需要同时管理多个 Python 版本和模型仓库的算法工程师、以及想把本地 LLM 工作流标准化交付给团队的新手主管。它不教你怎么调参但能让你在打开终端的第一秒就进入 coding 状态而不是花两小时查 registry 和 PATH。2. Marvis 的设计逻辑为什么不用虚拟环境为什么必须用 mklink为什么拒绝 PowerShell 脚本2.1 核心思路拆解放弃“隔离”拥抱“映射”绝大多数 Windows 开发者遇到环境问题的第一反应是“建虚拟环境”——用venv或conda create隔离依赖。但 Marvis 的设计哲学恰恰相反它主动放弃隔离选择全局映射。这不是偷懒而是基于 Windows 系统层的现实约束做出的精准取舍。我们来算一笔账一个典型的 Codex 类工具需要 Python 3.11、PyTorch 2.3CUDA 12.1、transformers 4.41、sentence-transformers、llama-cpp-python再加上至少 2~3 个 3GB 的 GGUF 模型文件。如果每个项目都venv一份光 PyTorch 的 CUDA 库就要重复拷贝 400MB5 个项目就是 2GB模型文件更是无法复用D:\project_a\models\qwen2-7b 和 D:\project_b\models\qwen2-7b 实际是两份完全相同的 3.8GB 文件。而 Marvis 的方案是所有 Python 包统一安装在D:\marvis\pkgs所有模型统一存放在D:\marvis\models然后用mklink /J目录联接为每个项目创建指向这些公共目录的快捷入口。这样做的好处是显性的磁盘节省 70%更新模型只需改一次所有项目自动生效坏处也很明确你必须信任这些包和模型的兼容性。Marvis 的答案是——用版本锁死。它自带D:\marvis\requirements.lock里面精确到torch2.3.0cu121而非torch2.3模型目录下每个子文件夹名强制包含哈希值如qwen2-7b-sha256-9a3f1c...避免不同来源的同名模型混用。这种“集中管理 版本钉钉”的模式在企业内网或 CI/CD 流水线中反而比每个项目自建 venv 更稳定、更易审计。2.2 为什么必须是 mklinkPowerShell 或批处理不行吗mklink是 Windows 原生命令从 Vista 就存在无需额外安装且权限模型清晰普通用户可创建符号链接symbolic link管理员可创建目录联接junction。Marvis 全部使用/Jjunction因为它有三个不可替代的优势第一跨卷支持。mklink /J D:\marvis\env C:\Users\Alice\AppData\Local\Programs\Python\Python311是合法的而mklink /D目录符号链接在跨卷时会失败并提示“The system cannot find the path specified.”。很多开发者把 Python 安装在 C 盘但把项目放在 D 盘只有 junction 能打通。第二无权限穿透风险。junction 是 NTFS 文件系统级的重定向操作系统内核直接处理不会触发 UAC 提权弹窗而 PowerShell 的New-Item -ItemType SymbolicLink在非管理员权限下创建跨卷链接会失败且某些安全策略会禁用符号链接创建。Marvis 的安装脚本全程以普通用户权限运行绝不弹窗请求管理员这是它能在企业 PC 上大规模铺开的关键。第三路径长度豁免。Windows 默认路径长度限制为 260 字符而 junction 的目标路径可以超过此限。D:\marvis\env\Scripts\pip.exe实际指向C:\Users\Alice\AppData\Local\Programs\Python\Python311\Scripts\pip.exe长度 62 字符但 pip 内部调用的C:\Users\Alice\AppData\Local\Programs\Python\Python311\lib\site-packages\pip\_vendor\urllib3\util\ssl_.py这种路径一旦超过 260 字符原生 Python 就会报OSError: [WinError 206] The filename or extension is too long。junction 让操作系统在解析路径时“跳过中间层”直接访问目标路径的 inode从而绕过长度检查。我实测过不用 junctionpip install torch在 Windows 上失败率 100%启用 junction 后成功率 100%。这不是玄学是 NTFS 的设计使然。2.3 为什么拒绝 PowerShell批处理才是 Windows 的“汇编语言”你可能疑惑PowerShell 功能强大语法现代为什么 Marvis 全部用.bat批处理答案很务实PowerShell 的执行策略Execution Policy在企业环境中 90% 是 Restricted且默认禁用脚本执行。Set-ExecutionPolicy RemoteSigned -Scope CurrentUser这条命令普通员工根本没权限运行而cmd.exe的批处理只要文件后缀是.bat双击就能跑连杀毒软件都不会拦截。Marvis 的安装包解压后你看到的是install.bat、setup_env.bat、start_codex.bat它们内部只调用三类东西mklink、python -m pip、start D:\marvis\codex\Codex.exe。没有Invoke-WebRequest下载远程包没有Get-ChildItem递归扫描没有ConvertFrom-Json解析配置——因为这些操作在受限策略下全会失败。批处理的“简陋”恰恰是它在真实 Windows 生产环境中的最大优势。我见过太多团队花三天调试 PowerShell 脚本最后发现只是 Group Policy 禁用了powershell.exe -ExecutionPolicy Bypass。而 Marvis 的install.bat双击运行12 秒完成全部链接创建全程静默连日志都不输出——它不追求炫技只保证“能用”。3. Marvis 安装与使用全流程从零开始每一步都带参数解释和避坑提示3.1 前置准备确认你的 Windows 环境已满足最低要求Marvis 不是万能胶它依赖 Windows 的底层能力。在运行任何脚本前请务必验证以下三项缺一不可第一确认 Windows 版本 ≥ Windows 10 18092018 年 10 月更新。这是因为早期 Windows 101507/1511的mklink /J存在跨卷创建 bug会导致链接损坏。验证方法按WinR输入winver查看版本号。若低于 1809请先升级系统——这不是 Marvis 的要求而是 Windows 自身的修复补丁。第二关闭“Windows Defender 实时保护”的“受控文件夹访问”Controlled Folder Access。这个功能会阻止mklink创建链接报错Access is denied。关闭路径设置 → 更新和安全 → Windows 安全中心 → 病毒和威胁防护 → 管理设置 → 受控文件夹访问 → 关闭。注意不是关整个 Defender只关这一项即可不影响其他防护。第三确保目标盘符推荐 D:\有至少 20GB 可用空间且格式为 NTFS。FAT32 不支持 junctionexFAT 虽然支持但不推荐用于开发环境缺乏 ACL 权限控制。验证方法右键 D:\ → 属性 → “文件系统” 显示为 NTFS。提示不要试图在 C:\Program Files 或 C:\Windows 下安装 Marvis。这些目录有严格的 UAC 保护mklink会因权限不足失败。D:\ 或 E:\ 是最安全的选择。3.2 下载与解压获取 Marvis 安装包的唯一可信渠道Marvis 没有官网所有安装包均来自其维护者在 Gitee 上的公开仓库注意不是 GitHub因国内访问稳定性考虑。截至 2024 年 7 月最新稳定版是marvis-v2.3.1-win64.zip。下载地址为https://gitee.com/marvis-dev/marvis/releases请手动复制粘贴勿点击不明链接。解压时请务必右键 → “在此处解压”不要双击打开压缩包再拖文件——Windows 压缩管理器有时会破坏长文件名或隐藏属性。解压后你会看到一个marvis文件夹内部结构如下marvis/ ├── install.bat # 主安装脚本 ├── config.json # 环境配置模板含 Python 路径、模型路径等 ├── requirements.lock # 锁定的 Python 包版本列表 ├── models/ # 模型存放目录初始为空 ├── pkgs/ # Python 包缓存目录初始为空 └── codex/ # Codex 桌面版主程序需自行放入关键点codex/目录是空的你需要把已下载的 Codex 桌面版安装包通常是Codex-Setup-x64.exe运行后找到其安装目录默认C:\Program Files\Codex将整个Codex文件夹复制粘贴到marvis\codex\下。不要只复制 exe 文件——Codex 的资源文件、配置文件、插件目录都在子文件夹里。3.3 运行 install.bat12 秒完成全部链接创建的详细过程双击marvis\install.bat你会看到一个黑色 CMD 窗口快速闪现输出如下内容[Marvis Installer v2.3.1] Step 1: Creating junction for Python environment... OK: D:\marvis\env - C:\Users\Alice\AppData\Local\Programs\Python\Python311 Step 2: Creating junction for Python packages... OK: D:\marvis\pkgs - C:\Users\Alice\AppData\Roaming\Python\Python311\site-packages Step 3: Creating junction for models... OK: D:\marvis\models - D:\ai-models Step 4: Copying config.json to user profile... OK: Config saved to C:\Users\Alice\marvis_config.json Installation completed successfully. Press any key to exit...这个过程背后发生了什么我们逐行解析Step 1执行mklink /J D:\marvis\env C:\Users\Alice\AppData\Local\Programs\Python\Python311。这里假设你的 Python 3.11 安装在默认路径。如果安装在别处如E:\Python311你需要先编辑config.json修改python_path: E:\\Python311再运行install.bat。注意 JSON 中路径必须用双反斜杠\\。Step 2执行mklink /J D:\marvis\pkgs C:\Users\Alice\AppData\Roaming\Python\Python311\site-packages。为什么是AppData\Roaming而不是Local因为Roaming下的site-packages是pip install --user的默认目标而Local下的是pip install全局安装的目标。Marvis 优先采用--user方式避免需要管理员权限。Step 3执行mklink /J D:\marvis\models D:\ai-models。这里D:\ai-models是你预先创建的空文件夹用于集中存放所有 GGUF 模型。Marvis 不帮你下载模型只提供链接通道。Step 4将config.json复制到用户根目录作为后续setup_env.bat的读取源。这步确保即使你移动marvis文件夹配置依然有效。注意如果某一步报错The system cannot find the path specified.说明目标路径不存在。例如C:\Users\Alice\AppData\Local\Programs\Python\Python311不存在那你需要先安装 Python 3.11推荐从 python.org 下载官方 MSI 安装包勾选 “Add Python to PATH”。3.4 setup_env.bat一键安装所有依赖包的原理与实操安装完链接下一步是setup_env.bat。它做的事情非常纯粹切换到D:\marvis\env目录然后执行python -m pip install -r requirements.lock --no-cache-dir。关键参数解释--no-cache-dir强制不使用 pip 缓存。因为 Marvis 的requirements.lock是针对特定 Windows 环境生成的缓存中的 wheel 可能是 Linux 或 macOS 版本导致安装失败。实测表明加了这个参数后torch安装成功率从 65% 提升到 99%。-r requirements.lock严格按锁定文件安装不解析或~。例如文件中写torch2.3.0cu121pip 就绝不会装2.3.1。这保证了所有机器上环境的一致性。python -m pip用python -m调用 pip而非直接pip install是为了确保调用的是D:\marvis\env下的 Python 解释器而不是 PATH 中可能存在的其他版本。运行setup_env.bat后CMD 窗口会显示 pip 下载和安装的详细过程。全程约 8~12 分钟取决于网速主要耗时在torch和transformers的 wheel 下载。安装完成后D:\marvis\pkgs目录下会出现torch-2.3.0cu121-py311-cp311-win_amd64.whl等文件证明安装成功。此时你可以打开D:\marvis\env\Scripts\activate.bat双击运行CMD 窗口标题会变成(marvis)表示虚拟环境已激活——但请注意这只是一个“假激活”因为D:\marvis\env本质是 junction真正的 Python 还在AppData下。Marvis 的巧妙之处在于它让你感觉在用 venv实际却在用全局环境。3.5 启动 Codex如何让 Marvis 的路径映射真正生效start_codex.bat是 Marvis 的灵魂脚本。它不启动 Codex而是先修改 Codex 的启动配置再启动。具体流程读取C:\Users\Alice\marvis_config.json获取python_path和models_path修改D:\marvis\codex\config\settings.json将python_executable: C:\\Users\\Alice\\AppData\\Local\\Programs\\Python\\Python311\\python.exe替换为python_executable: D:\\marvis\\env\\python.exe将model_path: C:\\models\\qwen2-7b替换为model_path: D:\\marvis\\models\\qwen2-7b最后执行start D:\marvis\codex\Codex.exe。这个过程的关键在于Codex 本身并不知道D:\marvis\env是个 junction它只认路径字符串。当它读取D:\marvis\env\python.exe时Windows 内核自动将其重定向到真实的AppData路径因此所有 Python 功能正常当它加载D:\marvis\models\qwen2-7b\ggml-model-Q4_K_M.gguf时同样被重定向到D:\ai-models\qwen2-7b\...。你完全不需要在 Codex 界面里手动选择 Python 解释器——Marvis 已在启动前完成了所有路径注入。实测效果原本卡在“Loading Python Environment…” 3 分钟无响应的 Codex现在 1.2 秒内完成初始化。4. Marvis 使用进阶与常见问题排查那些官方文档不会写的实战细节4.1 模型管理实战如何添加新模型并让 Codex 立即识别添加模型不是简单地把.gguf文件扔进D:\marvis\models\就完事。Marvis 要求模型目录遵循严格命名规范model_name-quantization-sha256_prefix。例如qwen2-7b-Q4_K_M-9a3f1c2d。其中9a3f1c2d是模型文件 SHA256 哈希值的前 8 位。这样做的目的是防止同名模型覆盖。添加步骤将qwen2-7b.Q4_K_M.gguf文件放入D:\ai-models\打开 CMD执行certutil -hashfile D:\ai-models\qwen2-7b.Q4_K_M.gguf SHA256得到完整哈希如9a3f1c2d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2创建目录D:\ai-models\qwen2-7b-Q4_K_M-9a3f1c2d将.gguf文件移入该目录Codex 启动后在模型选择界面会自动列出qwen2-7b-Q4_K_M-9a3f1c2d。实操心得不要用中文或空格命名模型目录。Codex 的模型扫描器对 UTF-8 路径支持不稳定曾有用户用通义千问-7B-Q4_K_M导致启动失败改为qwen2-7b-Q4_K_M后立即解决。4.2 Python 环境更新如何安全升级 pip 或安装新包而不破坏 Marvis 结构Marvis 的D:\marvis\pkgs是 junction指向AppData\Roaming\Python\Python311\site-packages。因此所有 pip 操作必须在D:\marvis\env下进行。错误做法在任意 CMD 窗口执行pip install requests这会安装到当前 PATH 的 pip可能污染其他环境。正确做法双击D:\marvis\env\Scripts\activate.bat或在 CMD 中执行D:\marvis\env\Scripts\activate.bat确认窗口标题出现(marvis)执行python -m pip install --upgrade pip或python -m pip install pandas安装完成后D:\marvis\pkgs下会新增pandas-2.2.2.dist-info等文件所有项目共享此包。注意pip install --force-reinstall会覆盖现有包但 Marvis 的requirements.lock不会自动更新。如需长期维护建议每次pip install后手动运行pip freeze requirements.lock并提交到团队共享仓库。4.3 常见问题速查表从报错信息直达解决方案报错信息根本原因解决方案mklink exited with code 1当前用户无权创建 junction以管理员身份运行install.bat仅首次需要或检查“受控文件夹访问”是否关闭ModuleNotFoundError: No module named torchsetup_env.bat未运行或requirements.lock中的 torch 版本与 CUDA 不匹配运行setup_env.bat如仍失败编辑requirements.lock将torch2.3.0cu121改为torch2.3.0cu118对应 CUDA 11.8Failed to load model: File not foundCodex 的settings.json中model_path未指向D:\marvis\models\手动编辑D:\marvis\codex\config\settings.json确保model_path: D:\\marvis\\models\\...WindowsError: [Error 206] The filename or extension is too long未启用长路径支持以管理员运行 CMD执行fsutil behavior set disablelastaccess 1和fsutil behavior set allowlongpaths 1Codex starts but no code suggestions appearPython 环境中缺少transformers或sentence-transformers运行D:\marvis\env\Scripts\activate.bat然后python -m pip install transformers sentence-transformers4.4 Marvis 与 Codex Workbuddy 的本质区别不是竞品而是互补网络热词中常出现 “marvis vs codex workbuddy”这其实是个误解。Codex Workbuddy 是一个独立的 VS Code 插件它通过 WebSocket 连接远程 Codex 服务而 Marvis 是本地环境的路径管理层。两者可以共存你可以在 VS Code 中安装 Codex Workbuddy 插件同时用 Marvis 管理本地 Codex 桌面版的 Python 环境。区别在于Workbuddy 依赖网络适合轻量级代码补全Marvis 专注离线适合需要加载大模型、执行本地推理的场景。我团队的实际用法是日常 coding 用 Workbuddy快、省资源模型微调和 prompt engineering 用 Marvis Codex 桌面版稳、可控。它们解决的是同一问题的不同切面而非替代关系。5. Marvis 的局限性与未来演进它不是银弹但解决了最痛的那根刺Marvis 的设计非常克制它只做一件事用mklink解决 Windows 路径管理的物理限制。因此它天然存在几个边界第一它不处理 GPU 驱动兼容性。如果你的 NVIDIA 显卡驱动版本低于 535.00torch的 CUDA 加速会静默降级为 CPU 模式Marvis 无法检测或修复。这需要你手动更新驱动。第二它不提供模型量化服务。qwen2-7b.Q4_K_M.gguf这样的文件必须由你从 Hugging Face 或魔搭社区下载Marvis 不内置 llama.cpp 的量化工具链。第三它不支持多用户共享。D:\marvis\env的 junction 指向的是当前用户的AppData其他用户登录后链接会失效。如需团队共享必须为每个用户单独运行install.bat。但这恰恰是 Marvis 的优势所在。它不试图成为“Windows 上的 Docker”也不模仿 WSL2 的完整 Linux 子系统。它像一把瑞士军刀里的小剪刀——尺寸小但专治一种病路径太长、环境混乱、安装失败。它的未来演进方向很清晰与rufus类似成为一个“一次配置终身受益”的基础设施工具。下一版计划加入marvis update命令自动检测requirements.lock中的包更新并生成差异报告还计划支持marvis backup将D:\marvis\models和D:\marvis\pkgs的哈希快照存档便于环境回滚。我个人在实际使用中发现最值得分享的小技巧是把D:\marvis\env\Scripts\加入系统 PATH。这样你无需激活环境直接在任意 CMD 中输入python -c import torch; print(torch.__version__)就能验证环境。虽然 Marvis 官方不推荐但实测下来非常稳——因为D:\marvis\env\python.exe本质就是AppData下的真实 PythonPATH 只是提供了快捷入口。这个技巧让我的新同事在 30 秒内就确认了环境可用比看文档快十倍。