Pylance提示语法错误,请求修复Python相机权限代码适配py2app
解决Pylance语法错误并适配py2app的摄像头权限代码修复
问题根源
你的代码混用了Swift语法调用AVFoundation框架,而Python(通过PyObjC调用Objective-C框架)有自己的语法规则,这直接导致了Pylance的语法错误,也无法被py2app正常编译。
核心错误点
- Swift风格的方法调用:
AVCaptureDevice.requestAccess(for: .video)不符合Python语法,PyObjC对Objective-C方法的命名采用下划线分隔格式 - Swift尾随闭包:
{ granted in ... }不是Python的回调写法,且异步回调会导致初始化阶段self.cam未就绪的竞态问题 - 枚举访问错误:Python中需通过PyObjC提供的常量访问AVFoundation枚举,而非Swift的
.语法
修复后的完整代码
import cv2 import numpy as np from AVFoundation import AVCaptureDevice, AVMediaTypeVideo class Camera(object): def __init__(self, camera=0): self.valid = False self.cam = None # 先检查权限状态 auth_status = AVCaptureDevice.authorizationStatusForMediaType_(AVMediaTypeVideo) if auth_status == AVCaptureDevice.AuthorizationStatus.Authorized: self._init_camera(camera) elif auth_status == AVCaptureDevice.AuthorizationStatus.NotDetermined: # 同步请求权限(避免异步回调导致的初始化问题) granted = AVCaptureDevice.requestAccessForMediaType_(AVMediaTypeVideo) if granted: self._init_camera(camera) else: print("Permission to access camera was denied.") else: print("Permission to access camera was denied or restricted.") def _init_camera(self, camera): """提取摄像头初始化逻辑,复用代码""" try: self.cam = cv2.VideoCapture(camera) resp, frame = self.cam.read() if resp: self.shape = frame.shape self.valid = True else: self.shape = None print("Failed to read from camera.") except Exception as e: self.shape = None print(f"Camera initialization error: {str(e)}") def get_frame(self): if self.valid and self.cam is not None: _, frame = self.cam.read() if frame is None: frame = self._get_error_frame() else: frame = self._get_error_frame() return frame def _get_error_frame(self): """提取错误帧生成逻辑,复用代码""" frame = np.ones((480, 640, 3), dtype=np.uint8) col = (0, 255, 255) # 修正256为255(CV2颜色值范围0-255) cv2.putText(frame, "(Error: Camera not accessible)", (65, 220), cv2.FONT_HERSHEY_PLAIN, 2, col) return frame def release(self): if self.cam is not None: self.cam.release()
关键修改说明
- PyObjC方法适配:
- 用
authorizationStatusForMediaType_替代Swift的authorizationStatus(for:) - 用
requestAccessForMediaType_替代Swift的requestAccess(for:completionHandler:),这里用同步调用避免异步回调的初始化问题(py2app打包后异步回调可能出现线程问题)
- 用
- 枚举正确访问:导入
AVMediaTypeVideo常量,替代Swift的.video - 代码结构优化:
- 拆分摄像头初始化和错误帧生成逻辑,提高代码复用性
- 增加
self.cam的空值判断,避免空指针异常 - 修正颜色值
256为255(OpenCV中颜色通道值范围是0-255)
- 异常处理优化:捕获具体异常并打印错误信息,避免吞掉所有异常
内容的提问来源于stack exchange,提问作者DSamuelHodge
相关产品推荐
相关产品推荐

