Python包管理|如何解决 pip install 网络报错 NewConnectionError: [Errno -2] Name or service not known(DNS)问题
2026/4/18 3:46:59 网站建设 项目流程

摘要

你想解决在执行pip install(包括pip install -r requirements.txt)时,终端抛出NewConnectionError: [Errno -2] Name or service not known的问题,该错误核心指向DNS(域名系统)解析失败——pip无法将PyPI源的域名(如pypi.org)解析为对应的IP地址,导致无法建立网络连接。解决该问题的核心逻辑是:先验证DNS解析是否失效,再针对性修复(更换可解析的PyPI镜像源、配置可靠的DNS服务器、处理网络代理/防火墙限制),而非盲目升级pip或重复执行安装命令(无法解决域名解析问题)。

文章目录

      • 摘要
  • 一、问题核心认知:错误本质与典型表现
    • 1.1 错误本质:DNS解析失败
    • 1.2 典型错误表现(附新手误区解读)
    • 1.3 DNS解析失败的核心特征
  • 二、问题根源拆解:5大类核心诱因(附详细分析)
    • 2.1 核心诱因1:系统DNS配置错误/失效(占比40%)
    • 2.2 核心诱因2:pip默认源域名无法解析(占比25%)
    • 2.3 核心诱因3:网络环境限制(代理/防火墙/VPN)(占比20%)
    • 2.4 核心诱因4:系统网络参数异常(占比10%)
    • 2.5 核心诱因5:临时DNS服务器/网络故障(占比5%)
  • 三、系统化解决步骤:按优先级逐一修复(从验证到解决)
    • 3.1 前置验证:5分钟定位DNS解析问题
      • 3.1.1 步骤1:测试域名解析是否失效
      • 3.1.2 步骤2:检查pip当前使用的源
    • 3.2 方案1:更换国内PyPI镜像源(最快解决,占比65%)
      • 3.2.1 临时使用(单次安装)
      • 3.2.2 永久配置(推荐,后续无需重复指定)
        • Linux/Mac
        • Windows
      • 3.2.3 常用国内镜像源(任选其一)
    • 3.3 方案2:配置系统可靠DNS服务器(解决系统级DNS失效)
      • 3.3.1 Linux(Ubuntu/Debian/CentOS)
        • 临时配置(重启网络后失效)
        • 永久配置(以Ubuntu 20.04+为例)
      • 3.3.2 Windows
      • 3.3.3 Mac
    • 3.4 方案3:处理网络代理/防火墙限制
      • 3.4.1 配置pip使用代理
      • 3.4.2 关闭不必要的防火墙/安全软件
      • 3.4.3 修复VPN异常后的DNS配置
    • 3.5 方案4:修复系统网络参数(进阶)
      • 3.5.1 修复Linux nsswitch.conf配置
      • 3.5.2 手动映射PyPI域名到IP(应急方案)
        • Linux/Mac
        • Windows
    • 3.6 方案5:验证修复效果
  • 四、排障技巧:特殊场景的解决方案
    • 4.1 问题1:Docker容器内DNS解析失败
      • 原因分析
      • 解决方案
    • 4.2 问题2:虚拟环境(venv/conda)内DNS失效
      • 原因分析
      • 解决方案
    • 4.3 问题3:企业内网仅允许访问内网镜像源
      • 原因分析
      • 解决方案
    • 4.4 问题4:IPv6导致的DNS解析异常
      • 原因分析
      • 解决方案
  • 五、预防措施:避免DNS解析问题的长期方案
    • 5.1 核心规范:永久配置国内PyPI源
    • 5.2 固定系统DNS服务器
    • 5.3 自动化网络检查脚本
    • 5.4 避免混用代理/VPN
  • 六、总结

一、问题核心认知:错误本质与典型表现

要解决该问题,需先理解两个核心点:DNS解析的作用该错误的触发逻辑,这是定位问题的根本前提:

1.1 错误本质:DNS解析失败

DNS的核心作用是将“域名(如pypi.org)”转换为“IP地址(如151.101.76.223)”,当出现Name or service not known时,意味着:

  • 系统无法找到可用的DNS服务器解析PyPI源域名;
  • 解析后的IP地址无法访问(但错误提示优先指向“域名识别失败”);
  • pip发起网络请求时,第一步的域名解析就已失败,后续连接无法建立。

1.2 典型错误表现(附新手误区解读)

完整的报错信息示例:

$ pipinstallrequests Collecting requests Could not fetch URL https://pypi.org/simple/requests/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org',port=443): Max retries exceeded with url: /simple/requests/(Caused by NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f8a1b2c3d40>: Failed to establish a new connection: [Errno -2] Name or service not known'))Could notfinda version that satisfies the requirement requests(from versions:)No matching distribution foundforrequests

新手常见误区:

  1. 误以为是pip版本过低/包不存在,反复执行pip install --upgrade pip或检查包名;
  2. 忽略“域名解析”核心问题,尝试修改pip的超时参数(如--timeout 100);
  3. 混淆“DNS解析失败”和“网络连接超时”,盲目关闭防火墙(无实际作用)。

1.3 DNS解析失败的核心特征

满足以下任一特征,可确认是DNS问题:

  • ping PyPI源域名提示unknown hostping pypi.orgping: pypi.org: Name or service not known
  • 更换其他域名(如baidu.com)也无法ping通(系统级DNS失效);
  • 直接用IP访问PyPI源可临时解决(如https://151.101.76.223/simple/)。

二、问题根源拆解:5大类核心诱因(附详细分析)

2.1 核心诱因1:系统DNS配置错误/失效(占比40%)

最常见原因:系统默认的DNS服务器不可用(如ISP提供的DNS宕机、配置为空):

  • Linux/Mac:/etc/resolv.conf文件中无有效DNS服务器,或配置的DNS(如192.168.1.1)无法解析外网域名;
  • Windows:网络适配器的DNS配置为“自动获取”但未获取到,或手动配置的DNS失效;
  • 多网卡环境(如同时连有线+无线),DNS配置指向未联网的网卡。

2.2 核心诱因2:pip默认源域名无法解析(占比25%)

  • 国内网络环境下,pypi.org/files.pythonhosted.org等默认源域名可能被DNS污染,无法解析;
  • 企业内网屏蔽了外网DNS解析,仅允许访问内网镜像源,但pip仍使用默认外网源。

2.3 核心诱因3:网络环境限制(代理/防火墙/VPN)(占比20%)

  • 代理服务器配置错误:pip使用的代理无法解析域名,或代理本身不可用;
  • 防火墙/安全软件拦截了DNS解析请求(如企业防火墙禁止访问外网DNS);
  • VPN连接异常:VPN断开后未恢复本地DNS配置,导致域名解析失败。

2.4 核心诱因4:系统网络参数异常(占比10%)

  • Linux:nsswitch.confhosts配置错误(如优先使用files而非dns解析域名);
  • 本地hosts文件(/etc/hostsC:\Windows\System32\drivers\etc\hosts)未正确映射PyPI域名;
  • 网络接口(如eth0/wlan0)未启用DNS解析功能。

2.5 核心诱因5:临时DNS服务器/网络故障(占比5%)

  • 公共DNS服务器(如8.8.8.8)临时宕机或网络拥堵;
  • 本地网络波动(如路由器重启、宽带断连)导致DNS解析超时。

三、系统化解决步骤:按优先级逐一修复(从验证到解决)

解决该问题的核心逻辑是:先验证DNS解析→再更换可用的PyPI源→最后修复系统DNS配置,每个步骤附可执行的命令/操作示例:

3.1 前置验证:5分钟定位DNS解析问题

3.1.1 步骤1:测试域名解析是否失效

执行以下命令,验证系统能否解析PyPI源域名:

# 方式1:ping测试(跨平台)pingpypi.org# 若输出“Name or service not known”,确认DNS解析失败# 方式2:nslookup/dig精准测试DNS解析(推荐)# Linux/Macnslookuppypi.org# 输出“** server can't find pypi.org: NXDOMAIN”说明解析失败digpypi.org# Windows(CMD/PowerShell)nslookuppypi.org

3.1.2 步骤2:检查pip当前使用的源

# 查看pip全局配置的源pip config list|grepindex-url# 若输出为空,说明使用默认源(pypi.org);若有值,检查该源域名是否可解析

3.2 方案1:更换国内PyPI镜像源(最快解决,占比65%)

国内镜像源(如清华、阿里云)的域名易解析、访问速度快,是解决该问题的首选方案:

3.2.1 临时使用(单次安装)

执行pip install时通过-i指定国内源:

# 安装单个包(以requests为例)pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple# 安装requirements.txtpipinstall-r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2.2 永久配置(推荐,后续无需重复指定)

Linux/Mac
# 1. 创建pip配置目录(若不存在)mkdir-p ~/.config/pip# 2. 写入国内源配置cat>~/.config/pip/pip.conf<<EOF [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120 EOF
Windows
  1. 打开文件资源管理器,输入%APPDATA%并回车;
  2. 在该目录下新建pip文件夹,进入后新建pip.ini文件;
  3. 写入以下内容:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120

3.2.3 常用国内镜像源(任选其一)

镜像源名称地址
清华源https://pypi.tuna.tsinghua.edu.cn/simple
阿里云https://mirrors.aliyun.com/pypi/simple/
豆瓣源https://pypi.douban.com/simple/
中科大https://pypi.mirrors.ustc.edu.cn/simple/

3.3 方案2:配置系统可靠DNS服务器(解决系统级DNS失效)

若更换源后仍报错,说明系统DNS配置本身有问题,需配置公共DNS(如谷歌8.8.8.8、阿里云223.5.5.5):

3.3.1 Linux(Ubuntu/Debian/CentOS)

临时配置(重启网络后失效)
# 方式1:直接修改resolv.conf(需root)sudoecho"nameserver 223.5.5.5">/etc/resolv.conf# 阿里云DNSsudoecho"nameserver 8.8.8.8">>/etc/resolv.conf# 谷歌DNS# 方式2:重启网络服务# Ubuntu/Debiansudosystemctl restart systemd-resolved# CentOS/RHELsudosystemctl restart NetworkManager
永久配置(以Ubuntu 20.04+为例)
  1. 编辑网络配置文件:sudo nano /etc/netplan/01-network-manager-all.yaml
  2. 添加DNS配置(替换为实际网卡名,如ens33):
network:ethernets:ens33:# 你的网卡名(通过ip addr查看)dhcp4:truenameservers:addresses:[223.5.5.5,8.8.8.8]version:2
  1. 应用配置:sudo netplan apply

3.3.2 Windows

  1. 右键桌面“网络”→“属性”→“更改适配器选项”;
  2. 右键当前联网的网卡(如WLAN/以太网)→“属性”;
  3. 双击“Internet协议版本4 (TCP/IPv4)”;
  4. 选择“使用下面的DNS服务器地址”,输入:
    • 首选DNS服务器:223.5.5.5(阿里云);
    • 备用DNS服务器:8.8.8.8(谷歌);
  5. 点击“确定”,重启网络连接。

3.3.3 Mac

  1. 打开“系统设置”→“网络”;
  2. 选择当前网络(如Wi-Fi)→“详细信息”→“DNS”;
  3. 点击“+”添加DNS服务器:223.5.5.58.8.8.8
  4. 移除原有无效DNS,点击“好”→“应用”。

3.4 方案3:处理网络代理/防火墙限制

若处于企业内网/代理环境,需配置pip使用代理,或关闭拦截DNS的防火墙:

3.4.1 配置pip使用代理

# 临时使用(单次安装)pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple --proxy http://代理IP:端口# 永久配置# Linux/Macpip configsetglobal.proxy http://代理IP:端口# Windowspip configsetglobal.proxy http://代理IP:端口# 若代理需要账号密码pip configsetglobal.proxy http://用户名:密码@代理IP:端口

3.4.2 关闭不必要的防火墙/安全软件

  • Linux:临时关闭firewalld/ufw(仅测试):
    # Ubuntu/Debiansudoufw disable# CentOS/RHELsudosystemctl stop firewalld
  • Windows:关闭“Windows Defender防火墙”或第三方安全软件(如360、腾讯电脑管家)。

3.4.3 修复VPN异常后的DNS配置

若VPN断开后DNS失效,需恢复本地DNS:

# Linux:重启网络服务sudosystemctl restart NetworkManager# Windows:在网络适配器中重新选择“自动获取DNS服务器地址”

3.5 方案4:修复系统网络参数(进阶)

3.5.1 修复Linux nsswitch.conf配置

确保系统优先使用DNS解析域名:

# 编辑nsswitch.confsudonano/etc/nsswitch.conf# 确保hosts行包含dns(如下)hosts: files dns myhostname

3.5.2 手动映射PyPI域名到IP(应急方案)

若DNS服务器仍不可用,可手动修改hosts文件:

Linux/Mac
sudoecho"151.101.76.223 pypi.org">>/etc/hostssudoecho"151.101.108.223 files.pythonhosted.org">>/etc/hosts
Windows
  1. 以管理员身份打开记事本,打开C:\Windows\System32\drivers\etc\hosts
  2. 添加以下内容:
151.101.76.223 pypi.org 151.101.108.223 files.pythonhosted.org
  1. 保存文件(若提示权限不足,先将hosts复制到桌面,修改后再替换回去)。

3.6 方案5:验证修复效果

执行以下命令,确认问题解决:

# 1. 测试DNS解析nslookuppypi.tuna.tsinghua.edu.cn# 应输出正常的IP地址# 2. 测试pip安装pipinstallrequests --dry-run# --dry-run模拟安装,无实际下载# 3. 若以上正常,执行实际安装pipinstall-r requirements.txt

四、排障技巧:特殊场景的解决方案

4.1 问题1:Docker容器内DNS解析失败

原因分析

Docker默认使用宿主机DNS,若宿主机DNS配置错误,或容器网络模式限制DNS解析。

解决方案

修改Dockerfile,配置容器内DNS:

FROM python:3.9-slim # 配置容器内DNS(阿里云+谷歌) RUN echo "nameserver 223.5.5.5" > /etc/resolv.conf \ && echo "nameserver 8.8.8.8" >> /etc/resolv.conf # 配置pip国内源 RUN mkdir -p ~/.config/pip \ && echo "[global]" > ~/.config/pip/pip.conf \ && echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> ~/.config/pip/pip.conf # 安装依赖 COPY requirements.txt . RUN pip install -r requirements.txt CMD ["python", "app.py"]

或运行容器时指定DNS:

dockerrun --dns223.5.5.5 --dns8.8.8.8 -it your-image:latest

4.2 问题2:虚拟环境(venv/conda)内DNS失效

原因分析

虚拟环境继承了宿主机的DNS配置,但代理/源配置未同步。

解决方案

# 1. 激活虚拟环境sourcevenv/bin/activate# Linux/Macvenv\Scripts\activate# Windows# 2. 在虚拟环境内配置pip源(与全局配置隔离)pip configsetglobal.index-url https://pypi.tuna.tsinghua.edu.cn/simple

4.3 问题3:企业内网仅允许访问内网镜像源

原因分析

企业防火墙禁止访问外网DNS,仅允许访问内网PyPI镜像。

解决方案

  1. 确认内网镜像源地址(如http://192.168.10.50:8080/simple);
  2. 配置pip使用内网源:
pip configsetglobal.index-url http://192.168.10.50:8080/simple pip configsetglobal.trusted-host192.168.10.50# 信任内网源(非HTTPS)

4.4 问题4:IPv6导致的DNS解析异常

原因分析

系统优先使用IPv6解析域名,但网络未启用IPv6,导致解析失败。

解决方案

临时禁用IPv6(Linux):

sudosysctl -w net.ipv6.conf.all.disable_ipv6=1sudosysctl -w net.ipv6.conf.default.disable_ipv6=1

或配置pip优先使用IPv4:

pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple --prefer-binary

五、预防措施:避免DNS解析问题的长期方案

5.1 核心规范:永久配置国内PyPI源

将国内源配置写入项目文档,确保团队所有成员使用相同源:

# 项目根目录创建pip.conf(Linux/Mac)或pip.ini(Windows),提交到代码库# 成员拉取代码后,执行以下命令生效cppip.conf ~/.config/pip/# Linux/Maccppip.ini %APPDATA%\pip\# Windows

5.2 固定系统DNS服务器

将公共DNS(阿里云223.5.5.5、腾讯119.29.29.29)配置为系统默认DNS,避免依赖不稳定的ISP DNS。

5.3 自动化网络检查脚本

在项目CI/CD或启动脚本中添加DNS检查,提前发现问题:

#!/bin/bash# check_dns.shecho"测试PyPI源DNS解析..."ifnslookuppypi.tuna.tsinghua.edu.cn>/dev/null2>&1;thenecho"DNS解析正常"elseecho"DNS解析失败,自动配置阿里云DNS..."sudoecho"nameserver 223.5.5.5">/etc/resolv.conffi# 执行pip安装pipinstall-r requirements.txt

5.4 避免混用代理/VPN

使用代理/VPN时,确保pip的代理配置与系统代理一致;断开VPN后,及时恢复本地DNS配置。

六、总结

解决pip installNewConnectionError: [Errno -2] Name or service not known的核心思路是定位DNS解析失效的层级(源/系统/网络),针对性修复,关键要点如下:

  1. 错误本质:pip无法解析PyPI源的域名,核心是DNS解析失败,而非pip本身问题;
  2. 核心解决方案
    • 优先更换国内PyPI镜像源(清华/阿里云),快速绕过外网DNS问题;
    • 配置系统可靠DNS(223.5.5.5/8.8.8.8),解决系统级DNS失效;
    • 处理代理/防火墙限制,确保网络环境允许DNS解析和包下载;
  3. 特殊场景:Docker容器需单独配置DNS,企业内网使用内网镜像源;
  4. 预防核心:永久配置国内源、固定系统DNS、添加自动化DNS检查。

遵循以上规则,可彻底解决pip安装时的DNS解析问题,同时保证包安装的稳定性和速度。

【专栏地址】
更多 Python包管理、网络配置解决方案,欢迎订阅我的 CSDN 专栏:🔥全栈BUG解决方案

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询