系统环境: windows 10专业版 64位python3.5.2
问题描述: os.popen执行系统命令move src_dir des_dir
移动文件无效,traceback提示文件被占用,移动目录0个
研究一番,发现工具process explorer, 用工具find->find handle or DLL,输入文件名称,可以查看占用文件的进程,
查询后发现是个c++库open文件后没有正常关闭文件,系统会保持一个file handle,导致无法操作文件,
在process explorer可以手动close handle,然后可以正常操作文件。
如何通过命令行来处理呢,查询某个目录下的文件是否被占用并自动解除占用(删除handle)
继续google,发现这个回答https://superuser.com/a/787179
在bat脚本里运行
@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p eclipse e:\git\') do echo Releasing %%k & handle -c %%j -y -p %%i
按自己的需求修改下
@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p python d:\projects\') do echo Releasing %%k & handle -c %%j -y -p %%i
优化将搜索目录作为参数传入,再修改
@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p python %1') do echo Releasing %%k & handle -c %%j -y -p %%i
脚本命名为remove_handle.bat(上述命令直接在cmd命令窗口执行时需要将参数前的%%换成%)
下载handle: https://docs.microsoft.com/zh-cn/sysinternals/downloads/handle
把解压目录添加到系统变量path
终于可以在python中直接调用脚本了
os.system('remove_handle.bat {}'.format(file_path))
然后再对file_path下的文件可执行任意操作了。这个操作比较暴力,可能因系统复用handle导致正在使用文件的进程发生未可知的错误。复制代码
转载于:https://juejin.im/post/5c751149f265da2d96181a70