windows 上 python open函数打开文件夹报错提示权限不足

终究是一个非常痛苦的夜晚。我没想到我会活着这么痛苦。

帮别人做一个小功能。把一个 android 设备里面固定目录下的log 导出到本地,然后打成压缩包.

需求很简单,在听到这个需求之后,我当时的预估时间是10分钟到1小时最多,不会超过1小时。。。。

我没想到,真正让我痛苦的,不是遇到了 windows 文件夹权限的问题,而是没有遇到这个问题,但是我以为我遇到的是这个问题…

这句话有的绕口,但是读完之后你就知道,这句总结还算到位.。

长话短说,我在使用 open()函数的时候,传入了一个文件夹作为参数,比如open("D:\\Games"), 然后 python 一直报错,说权限不足。

PermissionError: [Errno 13] Permission denied: 'D:\\Projects'

如果是一个正常人类可能会去查看API,或者网上找一下原因。我直接去网上找原因了。因为我要打开的这个文件夹比较特殊,是从其他设备上面导过来的,导致我以为是 windows 权限的问题。
因为网上有很多很多提示Windows 权限的报错。

基于此,我在网上找了好久,主要的方向就是,怎么去满足这个权限,不让它open失败。当然,没有效果的,因为根本原因是:通过open(file_path), 这个 file_path如果是一个目录而不是文件的话,就必然报错提示权限不足。
当然,也不能说是一无所获。

我找到了以下几种可能可以避免Windows 权限的解决方案了,只是目前用不上。

  1. 使用管理员权限去执行这个程序脚本。
    具体做法就是,找到 cmd.exe 这个程序,用鼠标右击去通过管理员的权限运行,然后在这个 cmd 窗口里面去执行脚本。
  2. 通过多进程的方式去执行。
    这个就更脑洞大开了。我看到的一个现象是,我通过给目标文件夹设置权限之后,不能立即去打开,但是把程序关闭,再次执行,又可以运行了。(当时情况特殊,后面我无法复现这个场景了)基于这么一个现象,我想到的原因是,因为当前进程跟之前的权限有关联,新启动的进程可以看到目标文件夹已经有权限了,所以用新的进程去打开。

这个地方门道还有点多,我一共使用了两种方式:

  • 第一种是使用 multiprocessing.Process的方式去开启子进程,然后把提权的操作放在这个子进程里面,然后在这个子进程执行结束之后,再去在父进程里面去调用 open() 函数。这个 multiprocessing 还是蛮不错的,它可以开任意多个进程,而且可以传参数,可以进行进程之间的数据共享。
  • 第二种就更牛批了,我都佩服自己,对于第二种实现方式。因为第一种方式也是失败(现在当然知道失败是因为open不能去传文件夹路径作为参数,但是当时不清楚),于是就想到,是不是因为这个父子进程之间也是互相关联的呢,导致在父进程依然不能获取到正确的权限。那么,我直接把当前进程关闭,重新开一个进程,这样总不会互相影响了吧。所以就有了第二种实现方法。大体的实现逻辑就是利用 sys.argv去自己给自己传参数,实现一个脚本在运行不同次数的时候,执行的逻辑不同,然后每次执行都是一个新的进程,完全不会被前面一次执行所影响。

为了实现第二种不互相影响的实现,我还搞了一个临时文件用来存储上一次执行的结果。因为不能互相影响导致前面执行的内存数据,在下次执行的时候无法读取,因为上一次的程序已经执行结束了,这些内存里面的数据也就消失了。那么,我就搞一个文本文件,相当于数据库一样,去记录上一次执行的结果,然后第二次执行的时候可以去读这个文件的内容,然后再执行具体的逻辑。

哎,贴一下代码,不过,因为一直失败,所以前面有的代码没有保留,直接被删除了。不过第二种实现方式倒是保留了,有兴趣的可以看看。

这里最困难不是这两种实现方案,而是 Windows 的文件夹权限处理。这一块的文档不是很多,然后也有一些文档写的比较详情,但是里面的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值