Coverage for src/ensae_teaching_cs/faq/faq_jupyter_helper.py: 50%
32 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief Helpers for jupyter, inspired from `nbopen.py <https://github.com/takluyver/nbopen/blob/master/nbopen.py>`_
6"""
8import os
9import os.path
10import warnings
11import webbrowser
12from pyquickhelper.loghelper import fLOG
15def find_best_server(filename, profile='default'):
16 """
17 Finds existing running server.
19 @param filename notebook
20 @param profile profile to use
21 @return a running server or None if not found
22 """
23 from notebook import notebookapp
24 kwargs = {}
25 if profile != 'default':
26 warnings.warn("Jupyter doesn't have profiles")
27 kwargs['profile'] = profile
28 servers = [si for si in notebookapp.list_running_servers(**kwargs)
29 if filename.startswith(si['notebook_dir'])]
30 try:
31 return max(servers, key=lambda si: len(si['notebook_dir']))
32 except ValueError:
33 return None
36def nb_open(filename, profile='default', open_browser=True, fLOG=fLOG):
37 """
38 Opens a notebook with an existing server,
39 if no server can be found, it starts a new one
40 (and the function runs until the server is closed).
42 @param filename notebook
43 @param profile profile to use
44 @param open_browser open browser or not
45 @param fLOG logging function
46 @return a running server or None if not found
47 """
48 filename = os.path.abspath(filename)
49 server_inf = find_best_server(filename, profile)
50 if server_inf is not None:
51 from notebook.utils import url_path_join
52 fLOG("Using existing server at", server_inf['notebook_dir'])
53 path = os.path.relpath(filename, start=server_inf['notebook_dir'])
54 url = url_path_join(server_inf['url'], 'notebooks', path)
55 webbrowser.open(url, new=2)
56 return server_inf
57 else:
58 fLOG("Starting new server")
59 home_dir = os.path.dirname(filename)
60 from notebook import notebookapp
61 server = notebookapp.launch_new_instance(file_to_run=os.path.abspath(filename),
62 notebook_dir=home_dir,
63 open_browser=open_browser,
64 # Avoid it seeing our own argv
65 argv=[],
66 )
67 return server