432 字
2 分钟
Page Views
Nuitka Windows 管理员终端编译问题

问题描述#

在 Windows 系统上使用 Nuitka 编译 Python 程序时,发现以下差异行为:

终端类型现象
管理员终端多线程编译时出现 .obj 文件访问错误,需要限制 --jobs=4 才能成功
非管理员终端无需限制线程数即可正常编译

根本原因#

这是 Nuitka 在 Windows 上的一个已知竞态条件问题,涉及以下因素:

1. clcache 竞态条件#

Nuitka 内嵌的 clcache (MSVC 编译缓存) 与 C 编译器之间存在文件访问竞争:

  • 线程 A 正在写入 .obj 文件到缓存
  • 线程 B 尝试读取/访问同一文件
  • 导致 “access denied” 或 “file not found” 错误

2. Windows Defender 实时保护#

  • 管理员权限:防病毒软件进行更深入的扫描,延长文件锁定时间
  • 非管理员权限:扫描强度较低,文件锁竞争减少

3. 文件系统行为差异#

管理员模式下 Windows 强制同步文件写入(FlushFileBuffers),增加了竞争窗口。

相关 GitHub Issues#

Issue描述链接
#1591Windows: Random “access denied” on clcache objects in Scons查看
#2832FileExistsError when running multiple builds in parallel查看
#2950FATAL: Failed unexpectedly in Scons C backend compilation查看
#2823Windows Defender 锁定文件导致资源添加失败查看

解决方案#

方案 1:限制并行任务数#

Terminal window
python -m nuitka --jobs=4 your_script.py

方案 2:禁用 LTO(减少文件 I/O)#

Terminal window
python -m nuitka --lto=no your_script.py

方案 3:添加防病毒排除项(推荐)#

将以下目录添加到 Windows Defender 排除列表:

  • %LOCALAPPDATA%\Nuitka
  • 项目构建目录

PowerShell 命令:

Terminal window
# 添加 Nuitka 缓存目录到排除项
Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\Nuitka"

环境信息#

项目版本/说明
Nuitka4.0.8
模式standalone
操作系统Windows 10/11
编译器MSVC (cl.exe)

参考#

评论

Nuitka Windows 管理员终端编译问题
https://swakinx.github.io/posts/nuitka-compilation-issue/
作者
Swakin
发布于
2026-05-13
许可协议
CC BY-NC-SA 4.0