Skip to content

wxGUI: Initial support for Jupyter-based workflows#5901

Open
lindakarlovska wants to merge 28 commits intoOSGeo:mainfrom
lindakarlovska:new-jupyter-pane-in-gui
Open

wxGUI: Initial support for Jupyter-based workflows#5901
lindakarlovska wants to merge 28 commits intoOSGeo:mainfrom
lindakarlovska:new-jupyter-pane-in-gui

Conversation

@lindakarlovska
Copy link
Contributor

@lindakarlovska lindakarlovska commented Jun 17, 2025

This pull request introduces the support for running Jupyter notebooks directly within the GUI.

How it works

There is a new Launch Jupyter Notebook Environment button added to the top menu, right next to the Launch Python Editor button (In this PR, these workflow-related buttons are now grouped together, since all of them serve a similar purpose — working with scripts or automation workflows.)

When you click the Launch Jupyter Notebook button, a new dialog appears — Start Jupyter.
In this dialog, you can:

  • Choose whether to use the default working directory (created automatically in your current MAPSET as /notebooks), or
  • Select a custom directory where you have write access.

The working directory is very important because in this directory the Jupyter server will be launched which means that each running Jupyter server is tied to a single directory — meaning that your entire Jupyter session is associated with that directory. If you want to work in a different directory, you simply start another Jupyter session from the GUI.

Besides the selection of a working directory, there’s also an option to create a preconfigured “welcome” notebook (a template). This lets you start working immediately with GRASS and Jupyter already initialized — including automatic imports of GRASS scripting and Jupyter modules, and initialization of the session to match your current GRASS environment.

Screenshot from 2025-10-30 14-01-53

Once you confirm the dialog:
• A local Jupyter server is started.
• The status bar (bottom left corner) shows information such as the running port and the server PID.
• If you selected the template option, a welcome.ipynb file is created in the chosen working directory, already set up with an initialized GRASS Jupyter session.

Screenshot from 2025-11-03 13-30-38

Why the Working Directory Matters

A Jupyter server always requires a working directory.
By default, GRASS uses <MAPSET_PATH>/notebooks, since it’s always available and writable. In the first version of this PR, the directory was created automatically inside the mapset.
During the PSC meeting in August 2025 ( https://grasswiki.osgeo.org/wiki/PSC_Meeting_2025-08-08), we decided it would be better to:

  • Let users choose the working directory, and
  • Offer a simple way to start with a good default template notebook.

That’s why the new Start Jupyter dialog exists — it provides both of these options.

What if Jupyter Isn’t Available?
Two cases are handled:

  • Jupyter isn’t installed at all, or
  • The user is on Windows, where Jupyter isn’t yet integrated in the GRASS build.

In both cases, the Launch Jupyter Notebook button will be disabled.

Screenshot from 2025-10-28 12-12-57

If the user clicks it anyway, an explanatory message will be shown describing the issue.

Screenshot from 2025-10-30 13-44-54

Windows Support

In version 8.5, the “Launch Jupyter” button will be active only on UNIX systems.
To make it work on Windows (both OSGeo4W and the standalone installer), Jupyter needs to be included in the build process.
That’s not too difficult — Jupyter itself is already included in the standalone installer — but its dependencies (folium and ipyleaflet) are missing from OSGeo4W packages.
I’ve submitted a PR to add them (jef-n/OSGeo4W#36 ) but it’s still awaiting feedback.
Until this is resolved, Jupyter integration won’t be available on Windows in version 8.5.

Implementation Overview

  • python/grass/workflows/
    - directory.py
    Contains the JupyterDirectoryManager class, which manages Jupyter notebooks linked to the given working directory.
    Responsibilities include mainly: Import/export of .ipynb files and managing notebook templates (welcome.ipynb, new.ipynb).
    - server.py
    Provides two key classes: JupyterServerInstance which handles the lifecycle of an individual Jupyter server instance—installation check, port management, startup, shutdown, URL generation, etc. Also handles cleanup using atexit and signal handling to ensure servers are terminated when GRASS exits via GUI, exit, CTRL+C, or kill PID. Further, JupyterServerRegistry—a singleton that registers all active Jupyter server instances. It allows the global shutdown of all running servers when GRASS is closed from the GUI.
    - enviroment.py
    High-level orchestrator JupyterEnvironment integrates a working directory manager (template creation and file discovery), a Jupyter server instance and a registration of running servers in a global server registry
    - template_notebooks/
    - welcome.ipynb: A welcome notebook created on demand if checked in the Start Jupyter dialog (created only if the working directory is empty – no .ipynb files present)
    - new.ipynb: A template used when the user creates a new notebook via GUI

  • gui/wxpython/jupyter_notebook/
    - panel.py - defines the JupyterPanel class, which creates the interactive panel inside the GUI. It includes: A toolbar and an AuiNotebook widget that lists and displays .ipynb files from the working directory
    - notebook.py
    Class JupyterAuiNotebook—Handles logic for adding AUI notebook tabs with JavaScript injection for hiding the Jupyter File menu and header.
    - dialogs.py
    Class StartJupyterDialog with Jupyter startup settings.
    - toolbars.py
    Class JupyterToolbar—Implements the toolbar controls for notebook actions: Create new notebook, Import notebook, Export notebook, Dock/Undock, Quit

Additional Notes

  • Multiple Jupyter servers can run in a single GRASS session (one per panel)
  • All servers are automatically stopped when the GUI is closed or the session ends, even forcefully
  • Newly created notebooks (welcome.ipynb or new.ipynb) are pre-initialized with the GRASS Jupyter environment and required imports for immediate use. Welcome.ipynb has some extra info about a working directory.

Following steps

  • Enable Jupyter support on Windows once dependencies are available in OSGeo4W.
  • At some point, we should revisit the discussion about implementing a GRASS-specific Jupyter kernel — I still believe it makes sense (for example, ArcGIS Pro also provides its own). With such a kernel, users could run notebooks without need for manual initialization code. They could simply select the GRASS kernel and start working in the same way, no matter whether launching Jupyter from within the GUI or in a standalone browser session. Just noting this here for context — we’ve already talked about it briefly, but during the summit in May 2025, it felt too early to make a decision. Perhaps it still is (@petrasovaa, @landa, @wenzeslaus).
  • Having in mind that we aim to make Jupyter more accessible to users by enabling GUI integration, in the future, we could also consider introducing GRASS magic commands (IPython extensions) to make command-line operations easier in Jupyter.
    For example:
    %region save=myregion – Save region
    %mapinfo elevation  - Print info about a raster or vector map
    %info – Print info about current session
    %run r.slope.aspect elevation=elevation slope=slope aspect=aspect

These could become part of a grass.jupyter library.

@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from be55385 to 817795e Compare June 17, 2025 11:33
@github-actions github-actions bot added GUI wxGUI related Python Related code is in Python libraries docs notebook CMake labels Jun 17, 2025
@lindakarlovska
Copy link
Contributor Author

Just set up the discussion page for the notebook working directory topic and workflows topic in general: #5909.

@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from 3a3b7e7 to 55974d3 Compare June 19, 2025 20:30
@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch 2 times, most recently from 968784b to 9d30c42 Compare October 1, 2025 12:44
@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from 65e8ea7 to 08a1f06 Compare October 28, 2025 08:49
@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch 3 times, most recently from 45af740 to adf7898 Compare November 2, 2025 06:01
@lindakarlovska lindakarlovska added this to the 8.5.0 milestone Nov 7, 2025
@tmszi
Copy link
Member

tmszi commented Nov 16, 2025

Small note:

Under Gentoo GNU/Linux distribution I get error message when I hit Start Jupyter Notebook tool button:

ebook.py", line 21, in <module>
    import wx.html2 as html  # wx.html2 is available in
wxPython 4.0 and later
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/wx/html2.py", line
15, in <module>
    from ._html2 import *
ModuleNotFoundError: No module named 'wx._html2'
The above exception was the direct cause of the following
exception:
Traceback (most recent call last):
  File
"/usr/lib64/grass85/gui/wxpython/main_window/frame.py", line
911, in OnJupyterNotebook
    from jupyter_notebook.panel import JupyterPanel
  File
"/usr/lib64/grass85/gui/wxpython/jupyter_notebook/panel.py",
line 24, in <module>
    from .notebook import JupyterAuiNotebook
  File "/usr/lib64/grass85/gui/wxpython/jupyter_notebook/not
ebook.py", line 23, in <module>
    raise RuntimeError(_("wx.html2 is required for Jupyter
integration.")) from e
RuntimeError: wx.html2 is required for Jupyter integration.

I have install wxPython 4.x.x version:

GRASS world_latlong_wgs84/PERMANENT:~ > python -c "import wx;print(wx.version())"
4.2.3 gtk3 (phoenix) wxWidgets 3.2.8

wxPython import wx.html2 module is not available because wxPython and underlaying wxGTK library are not compiled with USE webkit flag. With enabled this flag module is available.

x11-libs/wxGTK library USE flags:

tomas@gentoo-gnu-linux:~$ equery u x11-libs/wxGTK
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for x11-libs/wxGTK-3.2.8.1-r2:
 U I
 + + X          : Add support for X11
 - - abi_x86_32 : 32-bit (x86) libraries
 - - curl       : Add support for client-side URL transfer library
 + + debug      : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see
                  https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - doc        : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 + + gstreamer  : Enable the wxMediaCtrl class for playing audio and video through gstreamer. 
 - - keyring    : Enable support for freedesktop.org Secret Service API password store
 + + libnotify  : Enable desktop notification support
 + + lzma       : Support for LZMA compression algorithm
 + + opengl     : Add support for OpenGL (3D graphics)
 + + sdl        : Use Simple Directmedia Layer (media-libs/libsdl) for audio. 
 + + spell      : Add dictionary support
 - - test       : Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
 + + tiff       : Add support for the TIFF image format
 - - wayland    : Enable dev-libs/wayland backend
 + + webkit     : Add support for the WebKit HTML rendering/layout engine

dev-python/wxpython library USE flags:

tomas@gentoo-gnu-linux:~$ equery u dev-python/wxpython
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for dev-python/wxpython-4.2.3-r2:
 U I
 - - debug                     : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see
                                 https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - python_targets_python3_11 : Build with Python 3.11
 - - python_targets_python3_12 : Build with Python 3.12
 + + python_targets_python3_13 : Build with Python 3.13
 - - test                      : Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
 + + webkit                    : Add support for the WebKit HTML rendering/layout engine

@tmszi
Copy link
Member

tmszi commented Nov 17, 2025

When I hit JupyterLab tool button from the Jupyter notebook toolbar, GRASS GIS window was killed.

jupyter_notebook_btn_link

Jupyter Interactive Notebook version =dev-python/notebook-7.4.7

@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from 2c2788d to 36fa2c4 Compare January 2, 2026 11:03
@lindakarlovska
Copy link
Contributor Author

lindakarlovska commented Jan 2, 2026

Small note:

Under Gentoo GNU/Linux distribution I get error message when I hit Start Jupyter Notebook tool button:

ebook.py", line 21, in <module>
    import wx.html2 as html  # wx.html2 is available in
wxPython 4.0 and later
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/wx/html2.py", line
15, in <module>
    from ._html2 import *
ModuleNotFoundError: No module named 'wx._html2'
The above exception was the direct cause of the following
exception:
Traceback (most recent call last):
  File
"/usr/lib64/grass85/gui/wxpython/main_window/frame.py", line
911, in OnJupyterNotebook
    from jupyter_notebook.panel import JupyterPanel
  File
"/usr/lib64/grass85/gui/wxpython/jupyter_notebook/panel.py",
line 24, in <module>
    from .notebook import JupyterAuiNotebook
  File "/usr/lib64/grass85/gui/wxpython/jupyter_notebook/not
ebook.py", line 23, in <module>
    raise RuntimeError(_("wx.html2 is required for Jupyter
integration.")) from e
RuntimeError: wx.html2 is required for Jupyter integration.

I have install wxPython 4.x.x version:

GRASS world_latlong_wgs84/PERMANENT:~ > python -c "import wx;print(wx.version())"
4.2.3 gtk3 (phoenix) wxWidgets 3.2.8

wxPython import wx.html2 module is not available because wxPython and underlaying wxGTK library are not compiled with USE webkit flag. With enabled this flag module is available.

x11-libs/wxGTK library USE flags:

tomas@gentoo-gnu-linux:~$ equery u x11-libs/wxGTK
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for x11-libs/wxGTK-3.2.8.1-r2:
 U I
 + + X          : Add support for X11
 - - abi_x86_32 : 32-bit (x86) libraries
 - - curl       : Add support for client-side URL transfer library
 + + debug      : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see
                  https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - doc        : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 + + gstreamer  : Enable the wxMediaCtrl class for playing audio and video through gstreamer. 
 - - keyring    : Enable support for freedesktop.org Secret Service API password store
 + + libnotify  : Enable desktop notification support
 + + lzma       : Support for LZMA compression algorithm
 + + opengl     : Add support for OpenGL (3D graphics)
 + + sdl        : Use Simple Directmedia Layer (media-libs/libsdl) for audio. 
 + + spell      : Add dictionary support
 - - test       : Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
 + + tiff       : Add support for the TIFF image format
 - - wayland    : Enable dev-libs/wayland backend
 + + webkit     : Add support for the WebKit HTML rendering/layout engine

dev-python/wxpython library USE flags:

tomas@gentoo-gnu-linux:~$ equery u dev-python/wxpython
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for dev-python/wxpython-4.2.3-r2:
 U I
 - - debug                     : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see
                                 https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - python_targets_python3_11 : Build with Python 3.11
 - - python_targets_python3_12 : Build with Python 3.12
 + + python_targets_python3_13 : Build with Python 3.13
 - - test                      : Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
 + + webkit                    : Add support for the WebKit HTML rendering/layout engine

To keep things consistent with the Windows behavior, in 2d7b550 I added a check for wx.html2 as well. When it’s not available, the Jupyter button is disabled and shows a message explaining why.

@lindakarlovska
Copy link
Contributor Author

@tmszi thanks very much for the review! and sorry for the later response. @petrasovaa could you also make the review please so that we can merge it and incorporate this feature to the 8.5 version?

Comment on lines 68 to 70
if sys.platform.startswith("win"):
# For now, always disabled on Windows
return False
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not to do the full test and just see what is there instead of assuming what is the situation? Does Windows produce some user-visible error when subprocess fails?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just note for me - leaving this for the end of testing - test it also on Windows.

Comment on lines 187 to 190
proc = subprocess.Popen(
[
"jupyter",
"notebook",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know why Bandit does not complain here, but anyway, using shutil.which to get the full path and then executing that would help running this on Windows. Is this code running for you on Windows?

@petrasovaa
Copy link
Contributor

So, I noticed it was leaving zombies behind, so I had Claude analyze server.py and it identified the issue and also couple other issues, here is the AI-rewritten code, I tested it and I am fairly confident about Claude getting it right. the other file describes the reasons behind the changes.
server.py
server_py_fixed_issues.md

Comment on lines +25 to +26
class JupyterStartDialog(wx.Dialog):
"""Dialog for selecting Jupyter startup options."""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a basically a starter of jupyter notebook --no-browser with JupyterServerInstance being the controller for it. So, it seems it wouldn't be difficult to add a button here to start jupyter notebook with browser or jupyter lab. This would help users get the full Jupyter Notebook or Jupyter Lab experience without running these from the command line. Button in the GUI dialog:

Cancel | Open Notebook in Browser | Open Lab in Browser | Open Integrated Notebook

For Open Notebook in Browser and Open Lab in Browser, the notebook tab shows only controls for the shutting down the server. Open Integrated Notebook is the current experience.

This may align well with something like a Run RStudio button. We already do things to make running RStudio easier from within a GRASS session on Windows (see grass/mswindows), but in this case, we don't do anything for it in GUI (unlike Python scripts and now Jupyter notebooks).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Notably, this would be still available even when the user does not have wx.html2.

Copy link
Contributor Author

@lindakarlovska lindakarlovska Feb 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a great suggestion, I like it!!

content = template_copy.read_text(encoding="utf-8")

# Replace the placeholder '${NOTEBOOK_DIR}' with actual working directory path
content = content.replace(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would also hardcode the mapset path in gj.init:

        env = gs.gisenv()
        mapset_path = Path(env["GISDBASE"]) / env["LOCATION_NAME"] / env["MAPSET"]
        content = content.replace(
            "${NOTEBOOK_MAPSET}", f"\\\"{mapset_path}\\\""
        )

That way when you switch mapset in GUI and restart kernel in notebook, you will still init the same mapset session. Otherwise the behavior can be strange when you switch mapsets, restart kernel and then run session of the current mapset in a file saved in a different mapset.

self.dir_picker = wx.DirPickerCtrl(
self,
message=_("Choose a working directory"),
style=wx.DIRP_USE_TEXTCTRL | wx.DIRP_DIR_MUST_EXIST,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why wx.DIRP_DIR_MUST_EXIST? I don't see why you shouldn't be able to create a new directory.

Comment on lines +60 to +81
webview = event.GetEventObject()
js = """
var interval = setInterval(function() {
// --- Jupyter Notebook 7+ (new UI) ---
var topPanel = document.getElementById('top-panel-wrapper');
var menuPanel = document.getElementById('menu-panel-wrapper');
if (topPanel) topPanel.style.display = 'none';
if (menuPanel) menuPanel.style.display = 'none';

// --- Jupyter Notebook 6 and older (classic UI) ---
var headerContainer = document.getElementById('header-container');
var menubar = document.getElementById('menubar');
if (headerContainer) headerContainer.style.display = 'none';
if (menubar) menubar.style.display = 'none';

// --- Stop once everything is hidden ---
if ((topPanel || headerContainer) && (menuPanel || menubar)) {
clearInterval(interval);
}
}, 500);
"""
webview.RunScript(js)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest discussing this with Copilot or something. At least max tries would be nice.

- Jupyter Notebook 6 and older (classic interface)
- Jupyter Notebook 7+ (Jupyter Lab interface)

This is called once the WebView has fully loaded the Jupyter page.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but then the code uses interval to run the code, so this text should probably reflect that, possibly only before the JS code block , like "...but Jupyter UI may be (is?) create(ing?) the elements dynamically afterwards, so we need to wait for them to appear."

webview = event.GetEventObject()
js = """
var interval = setInterval(function() {
// --- Jupyter Notebook 7+ (new UI) ---
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't want the --- ... --- comment graphic elsewhere, so let's not add that here.

lindakarlovska and others added 8 commits February 5, 2026 13:26
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
Co-authored-by: Anna Petrasova <kratochanna@gmail.com>
@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from 943102a to 9461909 Compare February 5, 2026 21:27
@lindakarlovska
Copy link
Contributor Author

lindakarlovska commented Feb 5, 2026

Finally getting to the review! I like it overall!

It only works in single-window:

GRASS natural_earth_dataset/PERMANENT:gui > Traceback (most recent call last):
  File "/home/akratoc/dev/grass/grass_main/venv/lib/python3.12/site-packages/wx/core.py", line 3425, in <lambda>
    lambda event: event.callable(*event.args, **event.kw) )
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/akratoc/dev/grass/grass_main/dist.x86_64-pc-linux-gnu/gui/wxpython/wxgui.py", line 92, in show_main_gui
    mainframe = GMFrame(
                ^^^^^^^^
  File "/home/akratoc/dev/grass/grass_main/dist.x86_64-pc-linux-gnu/gui/wxpython/lmgr/frame.py", line 176, in __init__
    "tools": LMToolsToolbar(parent=self),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/akratoc/dev/grass/grass_main/dist.x86_64-pc-linux-gnu/gui/wxpython/lmgr/toolbars.py", line 195, in __init__
    self.InitToolbar(self._toolbarData())
                     ^^^^^^^^^^^^^^^^^^^
  File "/home/akratoc/dev/grass/grass_main/dist.x86_64-pc-linux-gnu/gui/wxpython/lmgr/toolbars.py", line 230, in _toolbarData
    jupyter_handler = self.parent.OnJupyterNotebook
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'GMFrame' object has no attribute 'OnJupyterNotebook'. Did you mean: 'GetLayerNotebook'?

Thanks for the review @petrasovaa and @wenzeslaus!
Regarding this point, I added the support in 9461909

@lindakarlovska
Copy link
Contributor Author

In version 8.5, the “Launch Jupyter” button will be active only on UNIX systems.
To make it work on Windows (both OSGeo4W and the standalone installer), Jupyter needs to be included in the build process.
That’s not too difficult — Jupyter itself is already included in the standalone installer...

This is not clear to me. It is already available on Windows? Your OSGeo4W PR seems to add it. Users can install it themselves both in OSGeo4W (as a OSGeo4W package) and in the standalone installer (as a pip package).

...but its dependencies (folium and ipyleaflet) are missing from OSGeo4W packages.

Just to be clear, your OSGeo4W PR does not add these. Again, users can install them. The packages are needed only for InteractiveMap; also only one is needed at a time.

@wenzeslaus Could you please leave a positive review on jef-n/OSGeo4W#36?

I was hoping it could be merged, but it hasn’t been yet.

If I understand correctly, you’re suggesting that we shouldn’t specifically handle folium and ipyleaflet for our use case, and that users who need them can install them separately on Windows. Would merging this OSGeo4W PR therefore resolve the Windows-related issue?

lindakladivova added 3 commits February 5, 2026 23:49
…tive, deletation of availability check - will be done after clicking on new buttons in Start dialog
@lindakarlovska lindakarlovska force-pushed the new-jupyter-pane-in-gui branch from 017ff58 to 6825d39 Compare February 6, 2026 12:45
@wenzeslaus
Copy link
Member

If I understand correctly, you’re suggesting that we shouldn’t specifically handle folium and ipyleaflet for our use case, and that users who need them can install them separately on Windows.

What I'm saying that there is no difference between Folium and Jupyter as missing dependencies as both can be installed with pip, so if user can install one, it can install the other. On the other hand, folium and ipyleaflet may need to be always installed with pip and they may need to be the latest version. Hard to tell for me.

Would merging this OSGeo4W PR therefore resolve the Windows-related issue?

What I did not understand was the test for jupyter executable present on Windows, or rather the the assumption that it is never there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CMake docs GUI wxGUI related libraries notebook Python Related code is in Python

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants