WSL2 中的 Python3 和 bitcoinrpc 存在网络连接问题,但在 WSL1 中没有出现此问题

WSL2 中的 Python3 和 bitcoinrpc 存在网络连接问题,但在 WSL1 中没有出现此问题

我在 Windows 10 上使用 WSL2 运行 Ubuntu 20.04。

我正在尝试通过 Python 连接到我的机器 127.0.0.1 上的比特币测试网服务器

Python 脚本在 Pycharm、命令提示符和 Powershell 上运行良好,直到最近我在 WSL1 上运行它时,在 Ubuntu 中也运行良好

切换到适用于 Ubuntu 的 WSL2 后,尽管在 CMD、PS 和 Pycharm 中同样可以工作,但我还是收到以下错误。似乎 Ubuntu 端有东西阻塞了。我该如何解决这个问题?禁用 Windows 快速启动并不能解决这个问题。

Traceback (most recent call last):
  File "/home/lalexk/mpcs56600-work/Lab4/Lab4.py", line 308, in <module>
    run_lab_4()
  File "/home/lalexk/mpcs56600-work/Lab4/Lab4.py", line 236, in run_lab_4
    block_info = connect_rpc(which_port, rpc_username, rpc_password, block_to_get)
  File "/home/lalexk/mpcs56600-work/Lab4/Lab4.py", line 41, in connect_rpc
    return rpc_connection.getblock(block_hash)
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/site-packages/bitcoinrpc/authproxy.py", line 132, in __call__
    self.__conn.request('POST', self.__url.path, postdata,
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 1257, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 1303, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 1252, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 1012, in _send_output
    self.send(msg)
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 952, in send
    self.connect()
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/http/client.py", line 923, in connect
    self.sock = self._create_connection(
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/socket.py", line 843, in create_connection
    raise err
  File "/home/linuxbrew/.linuxbrew/Cellar/[email protected]/3.9.6/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

答案1

我对这些脚本不太熟悉,但听起来你是说比特币服务器正在你的 Windows 主机上运行,​​并且你正尝试从127.0.0.1WSL2 内部连接到它。这至少可以解释你所经历的事情。

这种情况下 WSL1 和 WSL2 的区别在于:

  • WSL1 以非常简单的方式共享 Windows 网络。WSL1 实例具有与其 Windows 主机相同的 IP 地址,并且WSL1 内部的127.0.0.1/localhost与 Windows 相同localhost。它就像一个桥接网络。

  • 另一方面,WSL2 在更虚拟化的环境中运行,主要使用 Windows Hyper-V 虚拟机管理程序的元素。其网络位于运行 NAT 的虚拟 NIC 上在后面Windows 主机。/ 127.0.0.1localhost的是 WSL2 虚拟网络适配器,不是其 Windows 主机的。

解决方案应该相当简单。使用以下任一方法:

  • Windows 主机的地址(例如192.168.1.10
  • Hyper-V 设置的虚拟路由器的地址,可以在ip r l defaultWSL 中确定。
  • 或者该虚拟路由器的 mDNS 名称。这是 Windows“计算机名称”,后跟.local。如果您需要从 WSL2 内部确定该名称,则可以使用:
    echo "$(powershell.exe '[Console]::Write($env:COMPUTERNAME)').local"
    

如果我误解了您的设置并且它不起作用,请告诉我,我们可以澄清配置。

相关内容