为何os.unlink()在Windows报权限错误,在macOS却正常?
问题:使用cv2和os.unlink()时遇到Permission Error
我是一名Python新手,在使用cv2和os.unlink()时遇到了Permission Error。我的代码大致结构如下:
import cv2 import numpy as np import tempfile import os import time # Function to create and delete a temporary image file def calculate_tumor_location(frame): #We are accessing the global variables tumorX, tumorY in this function global tumorX, tumorY if ai_mode_enabled: rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # Save the frame temporarily with tempfile.NamedTemporaryFile(delete=False, suffix='.jpg') as tmp_file: cv2.imwrite(tmp_file.name, cv2.cvtColor(rgb_frame, cv2.COLOR_RGB2BGR)) prediction = client.infer(tmp_file.name) sum_x = 0 sum_y = 0 count = 0 for detection in prediction: points = detection['points'] for point in points: sum_x += int(point['x']) sum_y += int(point['y']) count += 1 #------Assigning colors--------- contour = np.array([[int(point['x']), int(point['y'])] for point in points], dtype=np.int32).reshape((-1, 1, 2)) cv2.polylines(frame, [contour], isClosed=True, color=brgcolor, thickness=2) cv2.putText(frame, detection['class'],(int(point['x']),int(point['y'])),cv2.FONT_HERSHEY_SIMPLEX,1,brgcolor,3) if count > 0: # Calculate midpoint midpoint_x = sum_x / count midpoint_y = sum_y / count # Update global variables tumorX = midpoint_x tumorY = midpoint_y os.unlink(tmp_file.name) return frame
我发现问题源于原本将os.unlink()语句放在with代码块内,但朋友的Mac电脑上,即使该语句处于缩进状态(即位于with块内),代码仍能正常运行。我已知道如何修复代码,但想了解这是Windows文件处理机制的特性,还是我忽略了其他更简单的原因?
回答
这确实是Windows和macOS文件系统处理机制的差异导致的:
Windows的文件锁机制:在Windows中,当文件被打开(
with块内的tmp_file还持有文件句柄),系统会给文件加排他锁,此时当前进程也无法删除这个文件,把os.unlink()放在with块内就会触发Permission Error。只有with块结束、文件句柄被关闭后,锁才会释放,这时才能正常删除文件。macOS的文件处理:macOS基于Unix系统,Unix允许删除正在被打开的文件——文件的目录项会被立刻移除,但文件内容会等到所有打开它的句柄都关闭后才会回收磁盘空间。所以在Mac上,即使
with块内的文件句柄没关闭,os.unlink()也能执行成功。
没有其他复杂原因,核心就是两个系统对已打开文件的删除权限限制不同。
内容的提问来源于stack exchange,提问作者3569jolibee
相关产品推荐
相关产品推荐

