Я пытаюсь получить текущее имя NoteBook при запуске ноутбука IPython. Я знаю, что вижу это в верхней части ноутбука. Что я за чем-то вроде
currentNotebook = IPython.foo.bar.notebookname()
Мне нужно получить имя в переменной.
Я пытаюсь получить текущее имя NoteBook при запуске ноутбука IPython. Я знаю, что вижу это в верхней части ноутбука. Что я за чем-то вроде
currentNotebook = IPython.foo.bar.notebookname()
Мне нужно получить имя в переменной.
Как уже упоминалось, вы, вероятно, действительно не должны это делать, но я нашел способ. Это пылающий хак, хотя и не полагайтесь на это вообще:
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, по крайней мере, с помощью простого теста. Вероятно, не гарантируется правильный ответ, если к одному и тому же ядру подключено несколько ноутбуков и т.д.
У меня есть следующее, которое работает с 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
В отличие от первого решения, изменения названия ноутбука обновляются немедленно, и нет необходимости обновлять ноутбук.
В 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
добавление к предыдущим ответам,
чтобы получить имя ноутбука, выполните следующие действия в ячейке:
%%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)