WSL2使用Python访问Windows 10上的MongoDB报错:pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Er

2023-05-16

WSL2使用Python访问Windows 10上的MongoDB报错:pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description:

1.软件环境⚙️

Windows 10 教育版64位
Python 3.6.3
WSL2 Ubuntu20.04
MongoDB 5.0
pymongo 3.12.0

2.问题描述🔍

WSL2WSL1的重大区别就是WSL2使用的是虚拟IP,因此在一些涉及到网络通信的操作时,可能会出现问题。
例如我这边MongoDB是装在Windows 10上面,为了数据库的信息能统一,我并没有在WSL2上面另外装一个MongoDB,而是想通过程序通过IP地址直接访问Windows 10上的MongoDB
但是程序在连接到MongoDB也没有立马拒绝,而是等了很久,最后报超时的错误:

pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 63ee5214d131347320a94054, topology_type: Single, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused',)>]>

即:
在这里插入图片描述

为了确认问题发生的原因,首先,使用如下代码测试 pymongo能否连接MongoDB

import pymongo

client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
db = client.test_database
collection = db.test_collection

运行上述代码发现没有报错,但是查看变量的时候要等很久很久:
在这里插入图片描述

可以看到,运行代码之后,确实连接了(connect=True),但又没完全连接~~所以在Pycharm中点击变量的值一直显示Collecting data... Getting Variable Value from Python Runtime,要等很久很久变量才返回,实锤了!这就是我们程序报time out的原因,那这个问题怎么解决呢?

在这里插入图片描述

3.解决方法🐡

其实这个问题的根源就是MongoDB默认绑定的IP是127.0.0.1localhostWSL2 本质上是一个虚拟机,在 WSL2 里运行的程序,不能用localhost来连接到数据库,如果需要访问 本机Windows 10里的MongoDB数据库,需要做如下修改:

3.1.查看自己MongoDB数据库绑定的IP

确保Windows 10主机上正在运行MongoDB服务,并且端口号为27017。可以在Windows 10命令提示符中运行以下命令来检查:

netstat -an | find "27017"

如果MongoDB服务正在运行,应该能够看到类似于以下内容的输出:

TCP    0.0.0.0:27017           0.0.0.0:0              LISTENING

如果不是0.0.0.0:27017,而是像我一样默认的127.0.0.1:27017
在这里插入图片描述
需要将0.0.0.0:27017改为127.0.0.1:27017

3.2.将Windows 10主机上运行的MongoDB实例绑定的IP地址修改为0.0.0.0而不是127.0.0.1

  1. 打开MongoDB的配置文件。默认情况下,MongoDB配置文件在Windows 10主机上的路径为C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg,其中<version>MongoDB版本号。可以使用文本编辑器打开此文件。

  2. 找到net部分。在MongoDB配置文件中,net部分定义MongoDB的网络接口和绑定IP地址。如果在配置文件中未找到net部分,请添加。

  3. bindIp参数的值更改为0.0.0.0(即绑定到所有可用的网络接口)。在net部分中,找到bindIp参数的行,然后将其值更改为0.0.0.0。例如,如果原始行为bindIp: 127.0.0.1,则更改为bindIp: 0.0.0.0。确保在bindIp行下面的缩进级别正确:
    在这里插入图片描述

  4. 保存并关闭MongoDB配置文件。

  5. 重启MongoDB服务。在Windows 10主机上打开命令提示符或PowerShell,然后运行以下命令以停止MongoDB服务:

    net stop MongoDB
    

    接下来,运行以下命令以启动MongoDB服务:

    net start MongoDB
    

    再次查看MongoDB服务的IP
    在这里插入图片描述

    现在,Windows 10主机上运行的MongoDB实例应该已绑定到0.0.0.0地址,而不是127.0.0.1地址。这将允许WSL2虚拟机和其他计算机通过网络连接到MongoDB

3.3.给WSL2解除防火墙限制

打开powershell,输入如下代码:

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

如果没有问题的话,会显示下面的消息:
在这里插入图片描述
这个时候会在防火墙为WSL2新建一条入站规则:
在这里插入图片描述
或直接打开入站规则:
在这里插入图片描述

在这里插入图片描述

3.4.获取Windows 10IP

WSL2中输入cat /etc/resolv.conf获取Windows 10IP,如我这边获得的输出是:

(tf2.5) jayce@DESKTOP:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.27.32.1

那么172.27.32.1就是我们要找的WindowsIP Address!因此我们只需要将程序中的127.0.0.1localhost换为172.27.32.1即可!

4.结果预览🤔

更改完毕后,可以看到我们成功在WSL2使用Python访问Windows 10上的MongoDB,程序能瞬间拿到连接:
在这里插入图片描述


渣男!都看到这里了,还不赶紧点赞评论收藏走一波?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSL2使用Python访问Windows 10上的MongoDB报错:pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Er 的相关文章

  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • 在 Python distutils 中从 setup.py 查找脚本目录的正确方法?

    我正在分发一个具有以下结构的包 mymodule mymodule init py mymodule code py scripts script1 py scripts script2 py The mymodule的子目录mymodul
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • Azure VM 上的 MongoDb 连接超时

    将我的 Azure Web 应用程序连接到 Azure VM 上托管的 MongoDb 时 我遇到一些超时问题 2015 12 19T15 57 47 330 0100 I NETWORK Socket recv errno 10060 A
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 使用yield 进行字典理解

    作为一个人为的例子 myset set a b c d mydict item yield join item s for item in myset and list mydict gives as cs bs ds a None b N
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 从 Azure 应用服务连接到 MongoDB Atlas 集群

    我在 Azure 上有一个 Web 应用程序 它连接到 Atlas cloud mongodb com 上托管的 MongoDB 集群 我想使用 Atlas 这样我就不必关心 MongoDb 配置 问题是我的集群连接超时 我必须在我的 mo

随机推荐