2012-09-22 33 views
40

Sto cercando di ottenere il nome del NoteBook corrente quando si esegue il notebook IPython. So che posso vederlo in cima al quaderno. Cosa sono dopo qualcosa comeCome ottenere il nome corrente del notebook IPython

currentNotebook = IPython.foo.bar.notebookname() 

Ho bisogno di ottenere il nome in una variabile.

+0

Che cosa stai cercando di fare con esso? In base alla progettazione, il kernel (il bit che esegue il codice) non conosce il frontend (il bit che apre i blocchi appunti). –

+4

Ciao, voglio usarlo con nbconvert per automatizzare il processo di creazione del notebook in latex/pdf. I miei taccuini funzionano da remoto. dopo una lezione gli studenti possono scaricare una versione pdf dei loro risultati. – Tooblippe

risposta

19

Come già accennato probabilmente non dovresti essere in grado di farlo, ma ho trovato un modo. Si tratta di una fiammeggiante incidere anche se così non si basano su questo a tutti:

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's 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 

Ho aggiornato la mia risposta per includere una soluzione che "funziona" in IPython 2.0 almeno con un semplice test. Probabilmente non è garantito dare la risposta corretta se ci sono più notebook collegati allo stesso kernel, ecc.

+0

connection_file_path = kernel.get_connection_file() non funziona più, filename è richiesto arg. – Purrell

+0

Questo ha funzionato bene per me su IPython .__ versione__ di '0.13.2' e non ho dovuto specificare un nome file per il kernel.get_connection_file() – Paul

+1

Alcuni aggiornamenti: invece di 'dal kernel di importazione IPython.lib' ora è solo' da Kernel di importazione IPython'. Inoltre, anziché utilizzare il "nome" della chiave nei dizionari, utilizzare il tasto "percorso" –

20

Ho il seguente che funziona con IPython 2.0. Ho osservato che il nome del notebook è memorizzato come valore dell'attributo 'data-notebook-name' nel tag <body> della pagina. Quindi l'idea è prima di chiedere a Javascript di recuperare l'attributo - i javascript possono essere richiamati da un codecell grazie alla magia %%javascript. Quindi è possibile accedere alla variabile Javascript attraverso una chiamata al kernel Python, con un comando che imposta una variabile Python. Poiché quest'ultima variabile è nota dal kernel, è possibile accedervi anche in altre celle.

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

Da una cella di codice Python

print(theNotebook) 

Out []: HowToGetTheNameOfTheNoteBook.ipynb

Un difetto in questa soluzione è che quando si cambia il titolo (nome) di un notebook, poi questo nome sembra non essere aggiornato immediatamente (probabilmente c'è un qualche tipo di cache) ed è necessario ricaricare il notebook per ottenere l'accesso al nuovo nome.

[Modifica] Riflettendo, una soluzione più efficiente è cercare il campo di input per il nome del notebook anziché il tag <body>. Esaminando la fonte, sembra che questo campo abbia id "nome_tabella". È quindi possibile prendere questo valore con un document.getElementById() e quindi seguire lo stesso approccio come sopra. Il codice diventa, ancora utilizzando il JavaScript magia

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

Poi, da una cella ipython,

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

Contrariamente alla prima soluzione, modifiche del nome del notebook vengono aggiornati immediatamente e non v'è alcuna necessità di aggiornare il notebook.

+0

Forse mi sono perso qualcosa, ma come si fa a richiamare il codice javascript da python? –

+1

Inizia semplicemente il codecell con la magia '%% javascript' – jfb

+3

È anche possibile chiamare javascript da python utilizzando il metodo di visualizzazione applicato a un oggetto javascript come' def getname(): display (Javascript ('IPython. notebook.kernel.execute ("theNotebook =" + "\" "+ IPython.notebook.notebook_name +" \ ""); ')) ' – Jakob

19

Su Jupyter 3.0 i seguenti lavori.Qui sto mostrando l'intero percorso sul server Jupyter, non solo il nome del notebook:

Per memorizzare il NOTEBOOK_FULL_PATH sulla corrente front-end notebook:

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

Per poi visualizzarlo:

print("NOTEBOOK_FULL_PATH:\n", NOTEBOOK_FULL_PATH) 

La prima cella Javascript non produce output. Esecuzione del secondo Python cellula produce qualcosa come:

NOTEBOOK_FULL_PATH: 
/user/zeph/GetNotebookName.ipynb 
+3

Questo è molto pulito. Come chiameresti allora il codice Javascript da una funzione Python? – Lukas

+0

Sembra funzionare solo se non si esegue il port forwarding – mwm314

+0

Hmmmm ... forse in tal caso dovresti aggiungere la porta con i due punti seguito dal numero di porta? –

7

aggiunta alle risposte precedenti,

per ottenere il nome notebook eseguire il seguente in una cella:

%%javascript 
IPython.notebook.kernel.execute('nb_name = ' + '"' + IPython.notebook.notebook_name + '"') 

questo ottiene il nome del file in nb_name

t per ottenere il percorso completo è possibile utilizzare quanto segue in una cella separata:

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

Utilizzando 'IPython.notebook.notebook_name' questo può essere fatto usando' '' %% javascript IPython.notebook.kernel.execute ('notebookName =' + '"' + IPython.notebook.notebook_name + '"' ') '' ' – jfb

Problemi correlati