pyglet.canvas.xlib.NoSuchDisplayException:无法连接到“无”只发生在 VSCode 终端

问题描述 投票:0回答:5

如果我在 VSCode 终端中运行这段代码

import pyglet
window = pyglet.window.Window(500, 500)

我明白了

Traceback (most recent call last):
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/__init__.py", line 334, in __getattr__
    return getattr(self._module, name)
AttributeError: 'NoneType' object has no attribute 'Window'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/justin/Dropbox/jr/py/pyglet_games/pyglet_demo/displaytest.py", line 5, in <module>
    window = pyglet.window.Window(500, 500)
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/__init__.py", line 340, in __getattr__
    __import__(import_name)
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/window/__init__.py", line 1891, in <module>
    gl._create_shadow_window()
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/gl/__init__.py", line 220, in _create_shadow_window
    _shadow_window = Window(width=1, height=1, visible=False)
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/window/xlib/__init__.py", line 171, in __init__
    super(XlibWindow, self).__init__(*args, **kwargs)
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/window/__init__.py", line 573, in __init__
    display = pyglet.canvas.get_display()
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/canvas/__init__.py", line 94, in get_display
    return Display()
  File "/home/justin/.local/lib/python3.8/site-packages/pyglet/canvas/xlib.py", line 123, in __init__
    raise NoSuchDisplayException('Cannot connect to "%s"' % name)
pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

但是,如果我在命令行中运行它,则会按预期出现一个窗口。如果我在我用来教书的 Thonny 中运行它,它也会按预期工作。我已验证在终端或 VSCode 中运行时 sys.version 和 sys.path 是相同的。

我已经搜索了这个问题的解决方案,但在其他少数存在的情况下,当以一种方式运行而不以另一种方式运行时,情况并非如此。大多数解决方案涉及更改显卡设置或运行 X11 服务器。这似乎与这里无关,因为它似乎只与 VSCode 有关。

谢谢。

visual-studio-code pyglet
5个回答
2
投票

我遇到了同样的问题,不仅仅是

pyglet
,还有任何试图打开窗户的东西。

看来是vs code内部终端的问题。将

console
设置为
launch.json
中的替代项为我修复了它。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "externalTerminal"
        }
    ]
}

所以确实,将以下内容添加到我的 python 脚本中可以解决问题(至少结合切换到 Wayland):

import os
os.environ['DISPLAY'] = ':1'

有谁知道如何使它成为永久设置,这样我编写的每个需要输出到显示器的模块都不需要它?


0
投票

在 vscode 中,您可以通过右键单击 python 代码来使用“在交互式窗口中运行当前文件”。

最右边的窗口是当我使用“Run Python File in Terminal”时出现错误的情况


0
投票

试试这个:

import platform
if platform.system() == "Linux":
    os.environ['PYOPENGL_PLATFORM'] = 'egl'

0
投票

如果你有同样的问题,并且在谷歌 Colab/python 环境中工作,将 pyglet 更新到这个版本,为我修复了它。

!pip install pyglet==1.5.27

0
投票

错误消息表明 Pyglet 无法连接到 X 服务器。如果您在无法访问 X 服务器的终端或环境中运行代码,例如 SSH 会话或无头服务器,就会发生这种情况。

要解决此问题,您可以尝试在图形环境中运行代码,例如在本地计算机或启用 X 转发的远程计算机上。如果您在远程终端会话中运行代码,则可以通过在 ssh 命令中使用 -X 或 -Y 标志来启用 X 转发。

如果您在无头环境或没有图形界面的机器上运行代码,您可以尝试使用虚拟 X 服务器(例如 Xvfb)来模拟 X 服务器。要使用 Xvfb,您可以在运行 Python 代码之前在后台启动它:

Xvfb :99 &
export DISPLAY=:99
python my_program.py

将 my_program.py 替换为您的 Python 脚本的名称。这将在显示器上启动 Xvfb :99 并设置 DISPLAY 环境变量以使用该显示器。

© www.soinside.com 2019 - 2024. All rights reserved.