我正在使用 python3 和 XLib 制作一些程序。
在我的 Ubuntu 14.04 电脑上,一切正常,但是当我尝试在笔记本中手动安装 Xorg 运行我的应用程序时,出现异常:
Xlib.error.DisplayConnectionError: Can't connect to display ":0": b'No protocol specified\n'
上线:
self.__display = Xlib.display.Display()
这是怎么回事?如何解决这个问题,使其可以在每个 Linux 上运行?
这看起来不像X11:以另一个用户身份运行 gnome 应用程序的重复。在我的两台计算机上,我有相同的用户和组,所以这个问题可能与缺乏运行我的程序的权限无关。
一定是 X 配置不好的其他原因。
好吧,这是 python3-xlib 中的错误。详情请参阅https://github.com/LiuLang/python3-xlib/issues/6。
这个问题与 x 显示服务器连接策略有关,默认情况下确实有限制
您可以通过允许访问将执行该代码的用户来解决此问题
如果您是要执行 plover 的用户,那么要粘贴到 shell 中的代码是
xhost +local:$USER
否则您可以使用将要运行代码的用户的用户名来切换
$USER
。
使此更改永久化的一种方法是将该行代码添加到您的登录脚本中,id est
~/.profile
为您的用户或文件中的任何用户 /etc/profile/
如果您想抑制命令输出文本,您可以将输出重定向到 /dev/null
,从而使整个命令:
xhost +local:$USER > /dev/null
在尝试运行 plover 时也遇到过同样的问题。
永久正确的解决方案是将允许的主机和用户添加到
/etc/Xn.hosts
,其中 n 代表显示编号(例如 /etc/X0.hosts
)。
以下内容将允许所有用户使用 localhost(不带尾随空格):
local:
FileNotFoundError Traceback(最近一次调用最后一次) /usr/local/lib/python3.10/dist-packages/Xlib/support/unix_connect.py in get_socket(dname, host, dno) 75 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) ---> 76 s.connect('/tmp/.X11-unix/X%d' % dno) 77 除了 OSError 为 val:
FileNotFoundError:[Errno 2]没有这样的文件或目录
在处理上述异常的过程中,又发生了一个异常:
DisplayConnectionError Traceback(最近一次调用最后一次) 7帧 /usr/local/lib/python3.10/dist-packages/Xlib/support/unix_connect.py in get_socket(dname, host, dno) 76 s.connect('/tmp/.X11-unix/X%d' % dno) 77 除了 OSError 作为 val: ---> 78 引发错误。DisplayConnectionError(dname, str(val)) 79 80 # 确保连接不会在子进程中继承
DisplayConnectionError:无法连接到显示器“:0”:[Errno 2]没有这样的文件或目录
如何解决这个问题?
肯定和权限有关系。 要获得超级用户权限,在 Linux 上您只需输入:
$ sudo su
<input your root password>
现在再次运行 python 文件
希望这有帮助!