Подтвердить что ты не робот

Как получить текущее имя ноутбука IPython

Я пытаюсь получить текущее имя NoteBook при запуске ноутбука IPython. Я знаю, что вижу это в верхней части ноутбука. Что я за чем-то вроде

currentNotebook = IPython.foo.bar.notebookname()

Мне нужно получить имя в переменной.

4b9b3361

Ответ 1

Как уже упоминалось, вы, вероятно, действительно не должны это делать, но я нашел способ. Это пылающий хак, хотя и не полагайтесь на это вообще:

import json
import os
import urllib2
import IPython
from IPython.lib import kernel
connection_file_path = kernel.get_connection_file()
connection_file = os.path.basename(connection_file_path)
kernel_id = connection_file.split('-', 1)[1].split('.')[0]

# Updated answer with semi-solutions for both IPython 2.x and IPython < 2.x
if IPython.version_info[0] < 2:
    ## Not sure if it even possible to get the port for the
    ## notebook app; so just using the default...
    notebooks = json.load(urllib2.urlopen('http://127.0.0.1:8888/notebooks'))
    for nb in notebooks:
        if nb['kernel_id'] == kernel_id:
            print nb['name']
            break
else:
    sessions = json.load(urllib2.urlopen('http://127.0.0.1:8888/api/sessions'))
    for sess in sessions:
        if sess['kernel']['id'] == kernel_id:
            print sess['notebook']['name']
            break

Я обновил свой ответ, чтобы включить решение, которое "работает" в IPython 2.0, по крайней мере, с помощью простого теста. Вероятно, не гарантируется правильный ответ, если к одному и тому же ядру подключено несколько ноутбуков и т.д.

Ответ 2

У меня есть следующее, которое работает с IPython 2.0. Я заметил, что имя ноутбука хранится как значение атрибута 'data-notebook-name' в теге <body> страницы. Таким образом, идея заключается в том, чтобы сначала спросить Javascript для получения атрибута - javascripts можно вызвать из кодовой книги благодаря магии %%javascript. Тогда можно получить доступ к переменной Javascript через вызов ядра Python с помощью команды, которая устанавливает переменную Python. Поскольку эта последняя переменная известна из ядра, ее также можно получить в других ячейках.

%%javascript
var kernel = IPython.notebook.kernel;
var body = document.body,  
    attribs = body.attributes;
var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'";
kernel.execute(command);

Из ячейки кода Python

print(theNotebook)

Out []: HowToGetTheNameOfTheNoteBook.ipynb

Дефект в этом решении заключается в том, что при изменении названия (имени) ноутбука это имя, похоже, не обновляется немедленно (возможно, есть какой-то кеш), и необходимо перезагрузить ноутбук, чтобы получить доступ к новому имени.

[Edit] При отражении более эффективным решением является поиск поля ввода для имени ноутбука вместо тега <body>. Заглядывая в источник, похоже, что это поле имеет id "имя_каталога". Затем можно поймать это значение на document.getElementById(), а затем следовать тому же подходу, что и выше. Код становится, все еще используя магию javascript

%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "'"+thename+"'";
kernel.execute(command);

Затем из ячейки ipython

In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis

В отличие от первого решения, изменения названия ноутбука обновляются немедленно, и нет необходимости обновлять ноутбук.

Ответ 3

В Jupyter 3.0 работает следующее. Здесь я показываю весь путь на сервере Jupyter, а не только имя ноутбука:

Чтобы сохранить NOTEBOOK_FULL_PATH на текущем интерфейсе ноутбука:

%%javascript
var nb = IPython.notebook;
var kernel = IPython.notebook.kernel;
var command = "NOTEBOOK_FULL_PATH = '" + nb.base_url + nb.notebook_path + "'";
kernel.execute(command);

Чтобы отобразить его:

print("NOTEBOOK_FULL_PATH:\n", NOTEBOOK_FULL_PATH)

Запуск первой Javascript ячейки не выводит. Запуск второй ячейки Python создает что-то вроде:

NOTEBOOK_FULL_PATH:
 /user/zeph/GetNotebookName.ipynb

Ответ 4

добавление к предыдущим ответам,

чтобы получить имя ноутбука, выполните следующие действия в ячейке:

%%javascript
var command = "nb_name = '" + IPython.notebook.notebook_path + "'; nb_name = nb_name.split('/')[-1]";
IPython.notebook.kernel.execute(command);

это дает вам имя файла в nb_name

то для получения полного пути вы можете использовать следующее в отдельной ячейке:

import os
nb_full_path = os.path.join(os.getcwd(), nb_name)