मैं ज्यूपिटर नोटबुक में फ़ंक्शन say_hello को कॉल करना चाहता हूं।

def say_hello():
  print('hello')

%%javascript
//What have been tried
// Method 1
var kernel = IPython.notebook.kernel;
kernel.execute("say_hello()", {"output": callback});

// Method 2
Jupyter.notebook.kernel.execute("say_hello()")

दोनों विधियां ब्राउज़र कंसोल में ReferenceError फेंकती हैं।

VM5326:7 Uncaught ReferenceError: IPython is not defined
    at send_message (<anonymous>:7:22)
    at onClickSendMessage (<anonymous>:12:9)
    at HTMLButtonElement.onclick (app.ipynb:1)

संस्करण: जुप्टरलैब 3.5, आईपीथन 7.16, पायथन 3.9.1

5
ppn029012 21 जिंदा 2021, 11:10
ऐसा लगता है कि नया आईपीथॉन जेएस एपीआई का समर्थन नहीं करता है?
 – 
ppn029012
23 जिंदा 2021, 08:26
मैं ज्यूपिटर-नोटबुक नहीं जानता। लेकिन, मुझे लगता है कि आपको print और return में समस्या हो रही है। कारण, मुझे लगता है कि आपकी विधि 2 में आप print जैसे स्रोत कोड चला रहे हैं। और, say_hello कमांड में आप print फ़ंक्शन का भी उपयोग कर रहे हैं। इसलिए, मुझे लगता है कि यदि आप say_hello कमांड में print के बजाय return लिखते हैं। मुझे लगता है यह उचित होगा...
 – 
user13146129
26 जिंदा 2021, 09:54
यह मेरे कार्य तर्क के बारे में नहीं है। यह इस बारे में है कि मैं अपने JS कोड में IPython और Jupyter ऑब्जेक्ट तक नहीं पहुंच सकता।
 – 
ppn029012
28 जिंदा 2021, 12:35

1 उत्तर

सबसे बढ़िया उत्तर

आपको जो ReferenceError मिल रहा है, वह Jupyter और IPython ग्लोबल्स के Jupyter Lab में उपलब्ध नहीं होने के कारण है। आपको एक JupyterLab एक्सटेंशन लिखना स्वयं करना होगा।

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

हमें 3 सेल चाहिए - पायथन, एचटीएमएल, और जेएस एक।

  1. आइए केवल उस विधि को परिभाषित करें जिसे हम JS से पायथन में लागू करना चाहते हैं।
def say_hello():
    print('hello')
  1. हमें एक सेल आउटपुट बनाने की जरूरत है, जहां जेएस निष्पादन के परिणाम लिख रहा होगा।
%%html
<div id="result_output">
  1. हम पायथन फ़ंक्शन को निष्पादित करते हैं, और निष्पादन परिणाम को कॉलबैक में संभालते हैं। कॉलबैक से, हम परिणाम टेक्स्ट को उस आउटपुट में भरेंगे जो हमने ऊपर बनाया था।
%%javascript
const callbacks = {
    iopub: {
        output: (data) => {
            // this will print a message in browser console
            console.log('hello in console')

            // this will insert the execution result into "result_output" div
            document.getElementById("result_output").innerHTML = data.content.text
        }
    }
};

const kernel = Jupyter.notebook.kernel
kernel.execute('say_hello()', callbacks)

कुछ नोट:

  • आपकी दूसरी विधि काफी अच्छी होगी यदि आपको परिणाम देखने की आवश्यकता नहीं है, निष्पादन निष्पादित किया गया है, केवल कर्नेल से परिणाम नियंत्रित नहीं होते हैं (आप वेबसोकेट अनुरोध संदेशों में ब्राउज़र devtools में नेटवर्क टैब में देख सकते हैं)
  • अपनी विधि 1 में आप callback का उपयोग करते हैं, लेकिन आप इसे परिभाषित नहीं करते हैं - इससे दूसरा ReferenceError
  • const का उपयोग करना बेहतर है JS . में var का उपयोग करने के बजाय
  • Jupyter.notebook.kernel IPython.notebook.kernel के समान है
6
Jakub Žitný 26 जिंदा 2021, 13:28