解决Vcpkg Cleaner中发生异常: PermissionError [WinError 5] 拒绝访问的问题

解决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),右键属性,按照第二步的方法执行一遍。
Alt

3、给予python.exe管理员权限

步骤如下:
找到按照python的位置,本文用的是Anaconda,安装在C盘,位置为:C:\ProgramData\anaconda3。找到python->右键->属性->兼容性,勾选以管理员身份运行此程序。
Alt

事实上以上方法并没有解决我的问题

我又尝试了安装全局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里面也有人提到这个问题,但是里面没有解决方案。因为我全部尝试了上述提到的方法,所以我只能保证在给予权限和管理员的前提下,更改代码可以有效解决问题。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值