我的 Windows 机器上安装了 WSL + Ubuntu,并安装了一些实用程序。
在我的 Ubuntu 终端中执行以下命令时会打开一个 GUI:
code .
(在当前工作目录中打开一个 vscode 实例)jupyter notebook
(在本地主机上打开一个 Chrome 实例)
在我的 Ubuntu 终端中执行以下命令时无法打开 GUI。
gvim test.txt
matplotlib.pyplot.show()
(在 Python 解释器中运行时)
我知道解决方法用于导出DISPLAY
环境变量以允许从命令行打开 GUI。为什么 WSL+Ubuntu 中的某些命令(code
、jupyter notebook
)可以成功在 Windows 主机中打开 GUI,而其他命令(gvim
、matplotlib
)则需要导出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 笔记本时正在使用的。