To understand what's going on, you have to make the distinction between "Windows GUI Apps" and "Linux (X) GUI Apps". Everything that you mention that opens is a Windows application.
It's important to note that this answer is only for the current released version of WSL. Later this year, WSLg is scheduled to be released with the 21H2 update of Windows 10. This will add the ability to run Linux GUI applications. As you mention a "workaround" in your question, you are already aware that WSL does not currently include this capability, unless you are running a Windows Insider/Preview version, or if you have manually installed a separate X Server and configured it (as mentioned in the "workaround").
While you would normally expect that you would have to start a Windows app in WSL using the .exe
version (and you'd be correct), there are a few exceptions.
For the code .
example that you mention, Microsoft specifically includes a shell script in the VSCode download and places it in the Windows PATH. Because you are calling code
instead of code.exe
, this shell script is being run. You can take a look at it with view "$(which code)"
. This script, among other things, ends up calling the Windows .exe
version.
If you are curious why Windows executables (.exe
's) work in WSL, please see this very good answer on the topic.
As for Jupyter notebooks, it is specifically launching a URL. Python includes a webbrowser
library that allows it to launch a browser with a URL. You can try it out by launching python3
and then entering the following commands:
>> import webbrowser
>> webbrowser.open("https://superuser.com/q/1654716/1210833")
true
Note that this only works out of the box on the Ubuntu distribution on WSL, and perhaps some others that have provided the proper hooks. For example, in OpenSuse, it does not work by default:
>> import webbrowser
>> webbrowser.open("https://superuser.com/q/1654716/1210833")
false
However, on other distributions, you can simply export the BROWSER
environment variable. For example, I'm using the Vivaldi browser on Windows:
export BROWSER="/mnt/c/Program Files/Vivaldi/Application/vivaldi.exe"
After that, OpenSuse works the same as Ubuntu with the webbrowser.open
call.
Ubuntu provides the wslu
package by default on WSL. This includes wslview
, to open the default app for a file (e.g. wslview payroll.pdf
) and also the www-browser
hook which is probably what Python is using when you launch your Jupyer notebook.
I am aware of the workarounds for exporting the DISPLAY environment variable
.. in addition to what @DanielB says.. this is not a "workaround" this is how x11 WORKS. You are NOT AWARE or you wouldn't have referred to it as a "workaround". You need an xserver. You need an IP address to host the xserver. By default on a linux machine, this is the loopback and by default, Linux has an xserver to host the calls (when running x11).code
andjupyter notebook
successfully open a graphical user interface on my monitor WITHOUT THE USE OF XSERVER?