You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Cython模块重编译遇LNK1104错误:如何免重启PyCharm?

解决Cython编译时LNK1104文件被占用的问题

这问题我折腾Cython的时候也碰到过好多次,太懂那种刚改完代码想编译却被文件占用卡死的烦躁了——本质就是你的.pyd编译产物被Python进程(大概率是PyCharm里的解释器会话)攥着,链接器没法覆盖它。给你几个不用重启IDE、也不会丢内存对象的实用办法:

  • 手动清理模块引用并触发垃圾回收
    如果你刚才在PyCharm的Python Console或者运行过的脚本里导入了这个模块,解释器会一直持有.pyd的文件句柄。可以在Console里依次执行:

    del your_module_name  # 替换成你的实际模块名
    import gc
    gc.collect()
    

    强制释放模块引用和相关资源,之后再重新执行build_ext --inplace试试。不过这个方法偶尔会因为模块有隐藏引用失效,不行就换下面的方案。

  • 终止PyCharm中所有运行的Python进程
    看PyCharm右上角的运行面板,有没有还在运行的脚本、Console会话?点那个红色的「停止」按钮,把所有相关的Python进程都关掉——这比重启IDE快太多,而且你打开的文件、编辑器配置啥的都不会丢。进程终止后,.pyd文件的占用就会自动释放,再编译就没问题了。

  • 给编译命令加前置清理步骤
    把你的编译命令改成:

    python setup.py clean --all build_ext --inplace
    

    先执行clean --all删掉之前的编译产物和中间文件,再重新编译。不过要注意,如果文件还被进程占用着,clean也删不掉,所以最好先确保进程没在占用,再用这个命令。

  • 用工具强制释放文件句柄(Windows专属)
    要是你经常碰到这个问题,可以用Process Explorer(绿色版就能用),搜索你的.pyd文件名,找到占用它的进程(一般是python.exe),右键选「Close Handle」就能直接释放文件。不用关进程,也不用重启IDE,就是需要额外装个小工具。

  • 分开编译和运行的进程
    别用PyCharm的Python Console来编译,改用IDE底部的Terminal(或者单独开个命令行窗口)执行编译命令——Terminal里的Python进程和你运行脚本的进程是完全分开的,就算脚本在IDE里跑着,编译也不会被影响。

一般来说,前两个方法就能解决90%的情况,不用重启IDE也不会丢你之前的内存对象。

内容的提问来源于stack exchange,提问作者Tim

火山引擎 最新活动