You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python请求Reolink IP摄像头快照报[Errno 65] No route to host错误的排查求助

看起来你的问题很典型——相同的脚本、相同的摄像头配置,Windows直连以太网正常,Mac通过USB-C转以太网适配器就卡壳,而且ping、RTSP等其他网络操作都没问题,这大概率是Mac的网络层或者Python环境的特定配置在搞鬼。我整理了几个针对性的排查方向,你可以逐一尝试:

  • 检查Mac的网络接口优先级与路由
    Mac同时存在Wi-Fi和USB以太网适配器时,系统可能会默认优先走Wi-Fi接口,哪怕你的摄像头在USB以太网的子网里。

    1. 图形化方式:打开「系统设置 → 网络」,长按左下角的「⋯」按钮选择「设置服务顺序」,把Belkin的以太网接口拖到最顶端,让系统优先用它访问该子网。
    2. 命令行验证:执行 route get 192.168.0.201,查看输出中的interface字段是否对应你的Belkin适配器(通常是en1/en2这类,而非Wi-Fi的en0)。
    3. 手动添加路由:如果路由指向错误的接口,执行sudo route add -host 192.168.0.201 -interface <你的以太网接口名>(比如en2),强制Mac通过指定接口访问摄像头IP。
  • 排查Mac防火墙的应用级限制
    Mac的防火墙可能会单独拦截Python或IDE的出站请求,哪怕全局防火墙处于关闭状态:

    1. 打开「系统设置 → 隐私与安全性 → 防火墙 → 选项」,检查是否将Python、你的代码编辑器(如VS Code、PyCharm)的网络访问设为「阻止」,如果是,改成「允许」。
    2. 临时关闭防火墙测试:执行sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off,测试脚本是否能正常运行,测试完成后记得重新开启:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
  • 强制Python请求绑定到USB以太网接口
    极少数情况下,requests库会默认使用Wi-Fi接口发起请求,即使目标IP在USB以太网子网。你可以修改脚本,强制请求绑定到Belkin适配器的IP:

    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.util.connection import create_connection
    
    def create_source_adapter(source_ip):
        class SourceAddressAdapter(HTTPAdapter):
            def init_poolmanager(self, *args, **kwargs):
                kwargs['source_address'] = (source_ip, 0)
                return super().init_poolmanager(*args, **kwargs)
        return SourceAddressAdapter
    
    url = "http://192.168.0.201/snapshot.jpg"
    auth = ("username", "password")
    source_ip = "192.168.0.204"  # 你的Belkin适配器IP
    
    session = requests.Session()
    session.mount('http://', create_source_adapter(source_ip))
    
    try:
        response = session.get(url, auth=auth)
        if response.status_code == 200:
            with open("snapshot.jpg", "wb") as f:
                f.write(response.content)
            print("Snapshot saved!")
        else:
            print("Error:", response.status_code)
    except Exception as e:
        print("Error:", str(e))
    
  • 检查USB-C适配器的兼容性与驱动
    M2芯片的Mac对部分第三方USB-C以太网适配器可能存在兼容性问题:

    1. 尝试更换USB-C端口,或拔插适配器重置连接;
    2. 访问Belkin官方网站,查看是否有针对M2 Mac的专属驱动更新;
    3. 执行traceroute 192.168.0.201,如果第一步就显示无路由,基本可以确定是适配器或接口的路由问题。
  • 关闭Python环境的代理设置
    系统或Python的全局代理可能会干扰本地子网的请求,你可以在脚本中强制关闭代理:

    import requests
    
    url = "http://192.168.0.201/snapshot.jpg"
    auth = ("username", "password")
    # 强制禁用代理,避免请求被转发
    proxies = {'http': None, 'https': None}
    response = requests.get(url, auth=auth, proxies=proxies)
    
    if response.status_code == 200:
        with open("snapshot.jpg", "wb") as f:
            f.write(response.content)
        print("Snapshot saved!")
    else:
        print("Error:", response.status_code)
    

建议你先从「网络接口优先级」和「路由检查」开始,这是Mac多网络接口场景下最常见的问题根源。如果某个方法解决了你的问题,欢迎回来反馈结果!

火山引擎 最新活动