home / github / issue_comments

Menu
  • Search all tables
  • GraphQL API

issue_comments: 642522285

This data as json

html_url issue_url id node_id user created_at updated_at author_association body reactions issue performed_via_github_app
https://github.com/simonw/datasette/issues/394#issuecomment-642522285 https://api.github.com/repos/simonw/datasette/issues/394 642522285 MDEyOklzc3VlQ29tbWVudDY0MjUyMjI4NQ== 58298410 2020-06-11T09:15:19Z 2020-06-11T09:15:19Z NONE

Hi @wragge,

This looks great, thanks for the share! I refactored it into a self-contained function, binding on a random available TCP port (multi-user context). I am using subprocess API directly since the %run magic was leaving defunct process behind :/

```python import socket

from signal import SIGINT from subprocess import Popen, PIPE

from IPython.display import display, HTML from notebook.notebookapp import list_running_servers

def get_free_tcp_port(): """ Get a free TCP port. """ tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp.bind(('', 0)) _, port = tcp.getsockname() tcp.close() return port

def datasette(database): """ Run datasette on an SQLite database. """ # Get current running servers servers = list_running_servers()

# Get the current base url
base_url = next(servers)['base_url']

# Get a free port
port = get_free_tcp_port()

# Create a base url for Datasette suing the proxy path
proxy_url = f'{base_url}proxy/absolute/{port}/'

# Display a link to Datasette
display(HTML(f'<p><a href="{proxy_url}">View Datasette</a> (Click on the stop button to close the Datasette server)</p>'))

# Launch Datasette
with Popen(
    [
        'python', '-m', 'datasette', '--',
        database,
        '--port', str(port),
        '--config', f'base_url:{proxy_url}'
    ],
    stdout=PIPE,
    stderr=PIPE,
    bufsize=1,
    universal_newlines=True
) as p:
    print(p.stdout.readline(), end='')
    while True:
        try:
            line = p.stderr.readline()
            if not line:
                break
            print(line, end='')
            exit_code = p.poll()
        except KeyboardInterrupt:
            p.send_signal(SIGINT)

```

Ideally, I'd like some extra magic to notify users when they are leaving the closing the notebook tab and make them terminate the running datasette processes. I'll be looking for it.

{
    "total_count": 1,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 1,
    "rocket": 0,
    "eyes": 0
}
396212021  
Powered by Datasette · Queries took 0.821ms · About: github-to-sqlite