Cython模块重编译遇LNK1104错误:如何免重启PyCharm?
这问题我折腾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




