Python开发中的小问题及解决方法

Python开发中的小问题及解决方法

Pycharm不以pytest方式运行

运行脚本的时候以pytest方式运行时,如果要换回普通模式

  • 点击运行脚本时的配置旁边的展开

python run

  • 点击Edit configurations
  • 删除原有的pytest运行配置
  • 新增Python运行配置
  • 填写运行配置Name
  • 配置python解释器路径
  • 配置要运行的脚本路径
  • 保存即可以普通模式运行

解决urllib.request的HTTP请求在开启代理的情况下,访问502

问题背景:在开启Clash Verge系统代理,且是规则模式,已对访问域名及ip(这里是内网搭建的服务)尝试添加规则,会遇到错误ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。;但是关闭系统代理后,就能正常执行,目标的域名和ip也能ping的通。

ping的痛验证的是ICMP协议的连通性,并不代表HTTP请求会走同样的路径,系统代理主要影响的是HTTP/HTTPS流量。这个问题是由于urllib.request默认从环境变量或Windows注册表中获取代理设置,这可能回导致请求被代理拦截或路由错误。

由于这里的服务属于内网服务,即使Clash规则设定该域名为直连,开启系统代理后,请求经过代理的服务器无法访问到内网的服务而导致问题的出现。

  • 方法一:

    • 运行脚本前为访问的域名或ip设置环境变量

      1
      2
      3
      set NO_PROXY=<域名>,<内网服务ip>

      例子:set NO_PROXY=030321.xyz,10.10.11.*
    • Pycharm中编辑环境配置,在环境变量中添加NO_PROXY,值同上

  • 方法二:

    • 代码中添加

      1
      2
      3
      4
      5
      6
      7
      8
      9
      import os
      os.environ["no_proxy"] = "<域名>,<内网服务ip>"

      # 或者

      import urllib.request
      opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) # 传空字典关闭代理
      urllib.request.install_opener(opener)
      # 然后再调用 push_to_gateway,这时 urllib 会使用没有代理的新 opener。