You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. PyObjC方法适配:
    • 用authorizationStatusForMediaType_替代Swift的authorizationStatus(for:)
    • 用requestAccessForMediaType_替代Swift的requestAccess(for:completionHandler:),这里用同步调用避免异步回调的初始化问题(py2app打包后异步回调可能出现线程问题)
  2. 枚举正确访问:导入AVMediaTypeVideo常量,替代Swift的.video
  3. 代码结构优化:
    • 拆分摄像头初始化和错误帧生成逻辑,提高代码复用性
    • 增加self.cam的空值判断,避免空指针异常
    • 修正颜色值256为255(OpenCV中颜色通道值范围是0-255)
  4. 异常处理优化:捕获具体异常并打印错误信息,避免吞掉所有异常

内容的提问来源于stack exchange,提问作者DSamuelHodge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:15:11