37
37
38
38
39
39
class _GlobalState :
40
- def __init__ (self ):
40
+ def __init__ (self , auto_shutdown : bool ):
41
41
# why +60? If page not auto open, user manually open page, we should give user more time to interact with page.
42
42
self .last_health_time = time .time () + 60
43
+ self .auto_shutdown = auto_shutdown
43
44
44
45
45
46
class _PygWalkerHandler (http .server .SimpleHTTPRequestHandler ):
@@ -59,7 +60,11 @@ def do_GET(self):
59
60
60
61
props = self ._walker ._get_props ("web_server" )
61
62
props ["communicationUrl" ] = "comm"
62
- html = self ._walker ._get_render_iframe (props ) + _SEND_HEALTH_JS_SCRIPT
63
+
64
+ html = self ._walker ._get_render_iframe (props )
65
+ if self ._state .auto_shutdown :
66
+ html += _SEND_HEALTH_JS_SCRIPT
67
+
63
68
self .send_response (200 )
64
69
self .send_header ("Content-type" , "text/html" )
65
70
self .end_headers ()
@@ -100,34 +105,51 @@ class CustomPygWalkerHandler(_PygWalkerHandler):
100
105
return CustomPygWalkerHandler
101
106
102
107
103
- def _start_server (walker : PygWalker , port : Optional [int ]):
108
+ def _open_browser (address : str , delay_ms : int = 1000 ):
109
+ """Open browser with address"""
110
+ time .sleep (delay_ms / 1000 )
111
+
112
+ try :
113
+ opened = webbrowser .open (address )
114
+ except Exception :
115
+ opened = False
116
+
117
+ if opened :
118
+ print (f"Run pygwalker at { address } , close page or press Ctrl+C to end." )
119
+ else :
120
+ print (f"Auto open browser failed, please open { address } manually, close page or press Ctrl+C to end." )
121
+
122
+
123
+ def _start_server (
124
+ walker : PygWalker ,
125
+ port : Optional [int ],
126
+ * ,
127
+ auto_open : bool ,
128
+ auto_shutdown : bool ,
129
+ ):
104
130
"""Start a server with walker"""
105
- state = _GlobalState ()
131
+ state = _GlobalState (auto_shutdown = auto_shutdown )
106
132
walker ._init_callback (BaseCommunication (str (walker .gid )))
107
133
108
134
handler = _create_handler_with_walker (walker , state )
109
135
if port is None :
110
136
port = find_free_port ()
111
137
address = f"http://localhost:{ port } "
112
138
139
+ def _listen_shutdown ():
140
+ while 1 :
141
+ time .sleep (1 )
142
+ if time .time () - state .last_health_time > _MAX_HEALTH_TIMEOUT_SECONDS :
143
+ httpd .shutdown ()
144
+ break
145
+
113
146
try :
114
147
with CustomTCPServer (("127.0.0.1" , port ), handler ) as httpd :
115
- threading .Thread (target = httpd .serve_forever , daemon = True ).start ()
116
- try :
117
- opened = webbrowser .open (address )
118
- except Exception :
119
- opened = False
120
-
121
- if opened :
122
- print (f"Run pygwalker at { address } , close page or press Ctrl+C to end." )
123
- else :
124
- print (f"Auto open browser failed, please open { address } manually, close page or press Ctrl+C to end." )
125
-
126
- while 1 :
127
- time .sleep (1 )
128
- if time .time () - state .last_health_time > _MAX_HEALTH_TIMEOUT_SECONDS :
129
- httpd .shutdown ()
130
- break
148
+ if auto_open :
149
+ threading .Thread (target = _open_browser , args = (address ,)).start ()
150
+ if auto_shutdown :
151
+ threading .Thread (target = _listen_shutdown ).start ()
152
+ httpd .serve_forever ()
131
153
except KeyboardInterrupt :
132
154
pass
133
155
@@ -146,9 +168,12 @@ def walk(
146
168
kanaries_api_key : str = "" ,
147
169
default_tab : Literal ["data" , "vis" ] = "vis" ,
148
170
port : Optional [int ] = None ,
171
+ auto_shutdown : bool = False ,
172
+ auto_open : bool = False ,
149
173
** kwargs
150
174
):
151
- """Walk through pandas.DataFrame df with Graphic Walker
175
+ """Walk through pandas.DataFrame df with Graphic Walker.
176
+ This function was originally designed solely to launch Pygwalker in script mode.
152
177
153
178
Args:
154
179
- dataset (pl.DataFrame | pd.DataFrame | Connector, optional): dataframe.
@@ -164,6 +189,8 @@ def walk(
164
189
- default_tab (Literal["data", "vis"]): default tab to show. Default to "vis"
165
190
- cloud_computation(bool): Whether to use cloud compute for datas, it upload your data to kanaries cloud. Default to False.
166
191
- port (int): port to use for the server. Default to None, which means a random port will be used.
192
+ - auto_shutdown (bool): Whether to shutdown the server when the page is closed. Default to False.
193
+ - auto_open (bool): Whether to open the browser automatically. Default to False.
167
194
"""
168
195
check_expired_params (kwargs )
169
196
@@ -189,7 +216,7 @@ def walk(
189
216
cloud_computation = cloud_computation ,
190
217
** kwargs
191
218
)
192
- _start_server (walker , port )
219
+ _start_server (walker , port , auto_open = auto_open , auto_shutdown = auto_shutdown )
193
220
194
221
195
222
def render (
@@ -201,9 +228,13 @@ def render(
201
228
kernel_computation : Optional [bool ] = None ,
202
229
kanaries_api_key : str = "" ,
203
230
port : Optional [int ] = None ,
231
+ auto_shutdown : bool = False ,
232
+ auto_open : bool = False ,
204
233
** kwargs
205
234
):
206
235
"""
236
+ This function was originally designed solely to launch Pygwalker in script mode.
237
+
207
238
Args:
208
239
- dataset (pl.DataFrame | pd.DataFrame | Connector, optional): dataframe.
209
240
- spec (str): chart config data. config id, json, remote file url
@@ -214,6 +245,8 @@ def render(
214
245
- kernel_computation(bool): Whether to use kernel compute for datas, Default to None.
215
246
- kanaries_api_key (str): kanaries api key, Default to "".
216
247
- port (int): port to use for the server. Default to None, which means a random port will be used.
248
+ - auto_shutdown (bool): Whether to shutdown the server when the page is closed. Default to False.
249
+ - auto_open (bool): Whether to open the browser automatically. Default to False.
217
250
"""
218
251
219
252
walker = PygWalker (
@@ -235,7 +268,7 @@ def render(
235
268
cloud_computation = False ,
236
269
** kwargs
237
270
)
238
- _start_server (walker , port )
271
+ _start_server (walker , port , auto_open = auto_open , auto_shutdown = auto_shutdown )
239
272
240
273
241
274
def table (
@@ -246,9 +279,13 @@ def table(
246
279
kernel_computation : Optional [bool ] = None ,
247
280
kanaries_api_key : str = "" ,
248
281
port : Optional [int ] = None ,
282
+ auto_shutdown : bool = False ,
283
+ auto_open : bool = False ,
249
284
** kwargs
250
285
):
251
286
"""
287
+ This function was originally designed solely to launch Pygwalker in script mode.
288
+
252
289
Args:
253
290
- dataset (pl.DataFrame | pd.DataFrame | Connector, optional): dataframe.
254
291
@@ -258,6 +295,8 @@ def table(
258
295
- kernel_computation(bool): Whether to use kernel compute for datas, Default to None.
259
296
- kanaries_api_key (str): kanaries api key, Default to "".
260
297
- port (int): port to use for the server. Default to None, which means a random port will be used.
298
+ - auto_shutdown (bool): Whether to shutdown the server when the page is closed. Default to False.
299
+ - auto_open (bool): Whether to open the browser automatically. Default to False.
261
300
"""
262
301
walker = PygWalker (
263
302
gid = None ,
@@ -278,4 +317,4 @@ def table(
278
317
cloud_computation = False ,
279
318
** kwargs
280
319
)
281
- _start_server (walker , port )
320
+ _start_server (walker , port , auto_open = auto_open , auto_shutdown = auto_shutdown )
0 commit comments