PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用
Posted
技术标签:
【中文标题】PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用【英文标题】:PermissionError: [WinError 32] The process cannot access the file because it is being used by another process 【发布时间】:2015-01-28 16:41:04 【问题描述】:我的代码用于查看文件夹并删除分辨率为 1920x1080 的图像的脚本。我遇到的问题是当我的代码运行时;
import os
from PIL import Image
while True:
img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
for filename in os.listdir(img_dir):
filepath = os.path.join(img_dir, filename)
im = Image.open(filepath)
x, y = im.size
totalsize = x*y
if totalsize < 2073600:
os.remove(filepath)
我收到此错误消息:
Traceback (most recent call last):
File "C:\Users\Harold\Desktop\imagefilter.py", line 12, in <module>
os.remove(filepath)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Harold\\Google Drive\\wallpapers\\Car - ABT Audi RS6-R [OS] [1600x1060].jpg'
确认一下,Python 是我计算机上唯一运行的程序。是什么导致了这个问题,我该如何解决?
【问题讨论】:
【参考方案1】:您的进程是打开文件的进程(通过im
仍然存在)。删除前需要先关闭。
我不知道 PIL 是否支持 with
上下文,但如果支持:
import os
from PIL import Image
while True:
img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
for filename in os.listdir(img_dir):
filepath = os.path.join(img_dir, filename)
with Image.open(filepath) as im:
x, y = im.size
totalsize = x*y
if totalsize < 2073600:
os.remove(filepath)
这将确保在您到达 os.remove
之前删除 im
(并关闭文件)。
如果没有,您可能想查看 Pillow,因为 PIL 开发几乎已死。
【讨论】:
【参考方案2】:我遇到了同样的问题,但错误是间歇性的。如果您正确编码文件打开/关闭但仍然遇到此错误,请确保您没有将文件与 Dropbox、Google Drive 等同步。我暂停了 Dropbox,我不再看到错误。
【讨论】:
【参考方案3】:这基本上是权限错误,您只需要在删除之前关闭文件即可。获取图像大小信息后,关闭图像
im.close()
【讨论】:
这并不适用于所有情况。例如,如果我使用代码file_path = os.path.join(os.path.expanduser("~/Desktop"),'my_file.zip')
构造一个路径,然后尝试file_path.close()
我得到 AttributeError: 'str' object has no attribute 'close'。
@AdrianKeister,那是因为您为 file_path 分配了一个“str”对象,而不是一个“file”对象。对于经验丰富的 Python 程序员来说,这是一个明显的错误。这个答案是关闭文件的一种完全可以接受的方式。但是,它不像使用接受的答案中提到的 with
上下文那样惯用。【参考方案4】:
我也遇到了这个问题,在 windows [WinError 32]
通过改变解决:
try:
f = urllib.request.urlopen(url)
_, fname = tempfile.mkstemp()
with open(fname, 'wb') as ff:
ff.write(f.read())
img = imread(fname)
os.remove(fname)
return img
进入:
try:
f = urllib.request.urlopen(url)
fd, fname = tempfile.mkstemp()
with open(fname, 'wb') as ff:
ff.write(f.read())
img = imread(fname)
os.close(fd)
os.remove(fname)
return img
在这里找到:https://no.coredump.biz/questions/45042466/permissionerror-winerror-32-when-trying-to-delete-a-temporary-image
【讨论】:
【参考方案5】:希望这会有所帮助。
import os
def close():
try:
os.system('TASKKILL /F /IM excel.exe')
except Exception:
print("KU")
close()
【讨论】:
以上是关于PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章
PermissionError:[Errno 13] 权限被拒绝:
当 conda install django, PermissionError(13, 'Permission denied')
PermissionError: [Errno 13] 权限被拒绝