2012-09-22 17 views
40

कैसे प्राप्त करूं, मैं आईपीथॉन नोटबुक चलाते समय वर्तमान नोटबुक नाम प्राप्त करने का प्रयास कर रहा हूं। मुझे पता है कि मैं इसे नोटबुक के शीर्ष पर देख सकता हूं।मैं वर्तमान आईपीथॉन नोटबुक नाम

currentNotebook = IPython.foo.bar.notebookname() 

मुझे किसी चर में नाम प्राप्त करने की आवश्यकता है।

+0

आप इसके साथ क्या करने की कोशिश कर रहे हैं? डिज़ाइन द्वारा, कर्नेल (बिट जो कोड चलाता है) को फ्रंटेंड के बारे में पता नहीं है (बिट जो नोटबुक खोलता है)। –

+4

हाय, मैं इसे नोटबुक को लेटेक्स/पीडीएफ निर्माण प्रक्रिया में स्वचालित करने के लिए nbconvert के साथ उपयोग करना चाहता हूं। मेरी नोटबुक दूरस्थ रूप से चलती हैं। कक्षा के बाद छात्र अपने परिणामों का एक पीडीएफ संस्करण डाउनलोड कर सकते हैं। – Tooblippe

उत्तर

19

जैसा कि पहले से ही उल्लेख किया गया है कि आप वास्तव में ऐसा करने में सक्षम नहीं हैं, लेकिन मुझे एक रास्ता मिला। यह एक फ्लेमिंग हैक हालांकि इतना सब पर इस पर भरोसा नहीं करते है:

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 

मैं अपने जवाब अद्यतन एक समाधान शामिल करने के लिए है कि कम से कम एक साधारण परीक्षण के साथ "काम" IPython 2.0 में। यदि संभवतः एक ही कर्नेल से जुड़े कई नोटबुक हैं, तो संभवतः सही उत्तर देने की गारंटी नहीं है

+0

connection_file_path = kernel.get_connection_file() अब और काम नहीं करता है, फ़ाइल नाम की आवश्यकता है तर्क। – Purrell

+0

यह मेरे लिए आईपीथॉन .__ संस्करण__ पर '0.13.2' के लिए ठीक काम करता है और मुझे कर्नेल.get_connection_file() – Paul

+1

के लिए फ़ाइल नाम निर्दिष्ट करने की आवश्यकता नहीं है कुछ अपडेट: 'ipython.lib आयात कर्नेल' के बजाय अब यह 'से है आईपीथन आयात कर्नेल '। शब्दकोशों में कुंजी 'नाम' का उपयोग करने के बजाय, कुंजी 'पथ' –

20

मेरे पास निम्नलिखित है जो आईपीथन 2.0 के साथ काम करता है। मैंने देखा कि पृष्ठ की <body> टैग में नोटबुक का नाम विशेषता 'data-notebook-name' के मान के रूप में संग्रहीत किया जाता है। इस प्रकार विचार सबसे पहले विशेषता को पुनर्प्राप्त करने के लिए जावास्क्रिप्ट से पूछना है - जावास्क्रिप्ट को कोडसेल से %%javascript जादू के लिए धन्यवाद दिया जा सकता है। फिर पाइथन कर्नेल को कॉल के माध्यम से जावास्क्रिप्ट चर तक पहुंच बनाना संभव है, जिसमें एक पायथन वैरिएबल सेट होता है। चूंकि यह अंतिम चर कर्नेल से ज्ञात है, इसलिए इसे अन्य कोशिकाओं में भी पहुंचा जा सकता है।

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

एक अजगर कोड सेल

print(theNotebook) 

[] बाहर से: HowToGetTheNameOfTheNoteBook.ipynb

इस समाधान में एक दोष यह है कि जब एक एक नोटबुक के शीर्षक (नाम) बदल जाता है तो, यह नाम तुरंत अपडेट नहीं किया जा रहा है (शायद कुछ प्रकार का कैश है) और नए नाम तक पहुंच प्राप्त करने के लिए नोटबुक को फिर से लोड करना आवश्यक है।

[संपादित करें] प्रतिबिंब पर, एक अधिक कुशल समाधान नोटबुक के बजाय नाम <body> टैग के लिए इनपुट क्षेत्र के लिए देखने के लिए है। स्रोत में देखकर, ऐसा प्रतीत होता है कि इस फ़ील्ड में आईडी "नोटबुक_नाम" है। document.getElementById() द्वारा इस मान को पकड़ना संभव है और फिर उपरोक्त के समान दृष्टिकोण का पालन करें। कोड, हो जाता है अभी भी जावास्क्रिप्ट जादू का उपयोग कर

%%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 

पहले समाधान के विपरीत, नोटबुक के नाम का संशोधन तुरंत अपडेट किया जाता है और ताज़ा करने के लिए कोई जरूरत नहीं है किताब।

+0

शायद मुझे कुछ याद आया, लेकिन आप पाइथन से जावास्क्रिप्ट कोड कैसे शुरू करते हैं? –

+1

आप बस '%% जावास्क्रिप्ट' – jfb

+3

के साथ कोडसेल शुरू करते हैं, जावास्क्रिप्ट ऑब्जेक्ट जैसे 'def getname(): डिस्प्ले (जावास्क्रिप्ट (' आईपीथन) पर लागू डिस्प्ले विधि का उपयोग करके जावास्क्रिप्ट को पाइथन के भीतर से कॉल करना भी संभव है। notebook.kernel.execute ("theNotebook =" + "\ '" + ipython.notebook.notebook_name + "\'"); ')) ' – Jakob

19

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) 

पहले रनिंग जावास्क्रिप्ट सेल कोई आउटपुट उत्पन्न नहीं करता है। दूसरा अजगर सेल चल रहा है की तरह कुछ का उत्पादन:

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

यह बहुत साफ है। तब आप पाइथन फ़ंक्शन से जावास्क्रिप्ट कोड को कैसे कॉल करेंगे? – Lukas

+0

केवल तभी काम करता है जब आप बंदरगाह अग्रेषित नहीं कर रहे हैं – mwm314

+0

हम्मम्म ... शायद उस स्थिति में आपको पोर्ट नंबर के बाद एक कोलन के साथ बंदरगाह जोड़ना चाहिए? –

7

पिछले जवाब को जोड़ने,

नोटबुक नाम एक सेल में निम्नलिखित चलाने पाने के लिए:

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

इस आपको nb_name

t में फ़ाइल का नाम मिलता है पूर्ण पथ प्राप्त करने के लिए मुर्गी आप एक अलग सेल में निम्नलिखित का उपयोग कर सकते हैं:

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

'IPython.notebook.notebook_name' का उपयोग करके' '' %% जावास्क्रिप्ट IPython.notebook.kernel.execute ('notebookName =' + '' '+ ipython.notebook.notebook_name +' '' ''' '' ' – jfb