WSL 如何管理 GUI 应用?为什么有些可以工作,而其他的却不行?

WSL 如何管理 GUI 应用?为什么有些可以工作,而其他的却不行?

我的 Windows 机器上安装了 WSL + Ubuntu,并安装了一些实用程序。

在我的 Ubuntu 终端中执行以下命令时会打开一个 GUI:

  • code .(在当前工作目录中打开一个 vscode 实例)
  • jupyter notebook(在本地主机上打开一个 Chrome 实例)

在我的 Ubuntu 终端中执行以下命令时无法打开 GUI。

  • gvim test.txt
  • matplotlib.pyplot.show()(在 Python 解释器中运行时)

我知道解决方法用于导出DISPLAY环境变量以允许从命令行打开 GUI。为什么 WSL+Ubuntu 中的某些命令(codejupyter notebook)可以成功在 Windows 主机中打开 GUI,而其他命令(gvimmatplotlib)则需要导出DISPLAY变量并使用 XServer?

答案1

要了解发生了什么,您必须区分“Windows GUI 应用程序”和“Linux (X) GUI 应用程序”。您提到的所有打开的内容都是 Windows 应用程序。

需要注意的是,这个答案仅适用于当前发布的 WSL 版本。今年晚些时候,WSLg 计划与 Windows 10 的 21H2 更新一起发布。这将增加运行 Linux GUI 应用程序的能力。正如您在问题中提到的“解决方法”,您已经知道 WSL 不会现在包括此功能,除非您正在运行 Windows Insider/Preview 版本,或者您已经手动安装了单独的 X 服务器并对其进行了配置(如“解决方法”中所述)。

虽然您通常会期望必须使用该.exe版本在 WSL 中启动 Windows 应用程序(并且您是正确的),但也有一些例外。

对于code .您提到的示例,Microsoft 专门在 VSCode 下载中包含了一个 shell 脚本,并将其放在 Windows PATH 中。由于您调用的是code而不是code.exe,因此正在运行此 shell 脚本。您可以使用 来查看它view "$(which code)"。除其他外,此脚本最终会调用 Windows.exe版本。

如果你好奇为什么 Windows 可执行文件可以.exe在 WSL 中运行,请参阅这个非常好的答案关于该主题。

至于 Jupyter 笔记本,它专门启动一个 URL。Python 包含一个webbrowser库,允许它使用 URL 启动浏览器。您可以通过启动python3然后输入以下命令来尝试它:

>> import webbrowser
>> webbrowser.open("https://superuser.com/q/1654716/1210833")
true

请注意,这只在 WSL 上的 Ubuntu 发行版上开箱即用,也许在其他一些提供了适当钩子的发行版上也可以。例如,在 OpenSuse 中,它默认不起作用:

>> import webbrowser
>> webbrowser.open("https://superuser.com/q/1654716/1210833")
false

但是,在其他发行版上,您只需导出BROWSER环境变量即可。例如,我在 Windows 上使用 Vivaldi 浏览器:

export BROWSER="/mnt/c/Program Files/Vivaldi/Application/vivaldi.exe"

此后,OpenSuse 的调用方式与 Ubuntu 相同webbrowser.open

Ubuntuwslu在 WSL 上默认提供了软件包。其中包括wslview,用于打开文件的默认应用程序(例如wslview payroll.pdf),以及钩子www-browser,这可能是 Python 在你启动 Jupyer 笔记本时正在使用的。

相关内容