解决VcpkgCleaner中发生异常: PermissionError [WinError 5] 拒绝访问的问题
网上大多提到的三种解决方法
1、给予User针对python.exe的完全控制权限
步骤如下:
找到按照python的位置,本文用的是Anaconda,安装在C盘,位置为:C:\ProgramData\anaconda3。找到python->右键->属性->安全->点击“组或用户名”中的Users->编辑->点击点击“组或用户名”中的Users->把“完全控制”打钩->应用->OK。
2、给予User针对整个文件夹的完全控制权限
找到你安装python的文件夹,本人用的是Anaconda3,那么就直接对该文件夹(本人安装位置为C:\ProgramData\anaconda3),右键属性,按照第二步的方法执行一遍。
3、给予python.exe管理员权限
步骤如下:
找到按照python的位置,本文用的是Anaconda,安装在C盘,位置为:C:\ProgramData\anaconda3。找到python->右键->属性->兼容性,勾选以管理员身份运行此程序。
事实上以上方法并没有解决我的问题
我又尝试了安装全局python,以管理员运行cmd执行python文件,打包python文件为exe使用管理员运行等等,然而它们都不起任何作用!!!
解决方案
核心是修改shutil.rmtree(path_prj)为 shutil.rmtree(path_prj, ignore_errors=True)
// 复制此处
shutil.rmtree(path_prj, ignore_errors=True);
最后执行成功的代码如下:
import os
import os.path
import shutil
vcpkg_home = "C:\\src\\vcpkg\\vcpkg"
pdb_fix = ".pdb"
log_fix = ".log"
src_dir = "src"
rel_build_temp_dir_fix = "-rel"
dbg_build_temp_dir_fix = "-dbg"
rm_temp = True
rm_log = True
rm_src = True
rm_pdb = True
def is_build_temp_dir(path):
"""
Check is the path for build temp
:param path:The absolute path witch need check
:return:bool
"""
return os.path.isdir(path) and \
(path.endswith(rel_build_temp_dir_fix)
or path.endswith(dbg_build_temp_dir_fix))
def is_log_file(path):
return path.endswith(log_fix)
def is_src_dir(path):
"""
Check is the path for source code
:param path: The absolute path witch need check
:return:bool
"""
return path.endswith(src_dir)
def clean_build_build_trees(buildtrees):
"""
Clean buildtrees dir.
:param buildtrees: The absolute path of buildtrees.
"""
for path_prj in os.listdir(buildtrees):
path_prj = os.path.join(buildtrees, path_prj)
if rm_temp and rm_src and rm_log:
#, οnerrοr = readonly_handler
print(path_prj)
shutil.rmtree(path_prj, ignore_errors=True)
else:
for path in os.listdir(path_prj):
full_path = os.path.join(path_prj, path)
if is_log_file(full_path) and rm_log:
os.remove(full_path)
elif is_build_temp_dir(full_path) and rm_temp:
shutil.rmtree(full_path)
elif is_src_dir(full_path) and rm_src:
shutil.rmtree(full_path)
print("Clean buildtrees Done!")
def clean_pdb_file(root_dir):
# get all pdb files
pdbs = []
for (root, dirs, files) in os.walk(root_dir):
pdbs += [os.path.join(root, file)
for file in files if file.endswith(pdb_fix)]
if rm_pdb:
for pdb in pdbs:
os.remove(pdb)
print("Clean *.pdf in %s: Done!" % os.path.basename(root_dir))
def clean(home):
clean_pdb_file(os.path.join(home, "installed"))
clean_pdb_file(os.path.join(home, "packages"))
clean_build_build_trees(os.path.join(home, "buildtrees"))
print("All clear!")
if __name__ == '__main__':
clean(vcpkg_home)
VcpkgCleaner的官方3下载地址如下
链接: VcpkgCleaner
git:https://github.com/ufolr/VcpkgCleaner.git
事实上官方issues里面也有人提到这个问题,但是里面没有解决方案。因为我全部尝试了上述提到的方法,所以我只能保证在给予权限和管理员的前提下,更改代码可以有效解决问题。