আমি কীভাবে বর্তমান আইপিথন / জুপিটার নোটবুকের নাম পাব?


87

আইপিথন নোটবুক চালানোর সময় আমি বর্তমান নোটবুকের নামটি পাওয়ার চেষ্টা করছি। আমি জানি আমি এটি নোটবুকের শীর্ষে দেখতে পাচ্ছি। আমি কিছু পরে কি করছি

currentNotebook = IPython.foo.bar.notebookname()

আমার একটি ভেরিয়েবলের নাম পাওয়া দরকার।


আপনি এটি দিয়ে কি করতে চেষ্টা করছেন? ডিজাইন দ্বারা, কার্নেল (বিটটি কোড চালায়) সীমানা (বিট যা নোটবুকগুলি খুলবে) সম্পর্কে জানে না।
টমাস কে

7
হাই, আমি নোটবুকটি লেটেক্স / পিডিএফ তৈরির প্রক্রিয়াতে স্বয়ংক্রিয় করতে এনবি কনভার্ট সহ এটি ব্যবহার করতে চাই। আমার নোটবুকগুলি দূর থেকে চলে। শ্রেণীর পরে শিক্ষার্থীরা তাদের ফলাফলগুলির একটি পিডিএফ সংস্করণ ডাউনলোড করতে পারে।
টুবলিপ

4
পি টোকাসেলির উত্তর জুপিটারল্যাবের সাম্প্রতিক সংস্করণ (1.1.4) (নোটবুক 5.6.0) এর সাথে ভাল কাজ করে এবং জাভাস্ক্রিপ্টের প্রয়োজন নেই।
joelostblom


কেউ কেউ কাজ করেছেন এবং একটি পাইপ প্যাকেজ তৈরি করেছেন: pypi.org/project/ipynbname ইনস্টল করুনpip install ipynbname
NeoTT

উত্তর:


26

ইতিমধ্যে উল্লিখিত হিসাবে আপনি সম্ভবত এটি করতে সক্ষম হবেন বলে মনে করা হচ্ছে না, তবে আমি একটি উপায় খুঁজে পেয়েছি। এটি একটি জ্বলন্ত হ্যাক যদিও এর উপর একেবারেই নির্ভর করবেন না:

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

আমি অন্তত একটি সহজ পরীক্ষা দিয়ে আইপথন ২.০ এ "কাজ করে" এমন একটি সমাধান অন্তর্ভুক্ত করার জন্য আমার উত্তর আপডেট করেছি। যদি একই কার্নেল ইত্যাদিতে একাধিক নোটবুক সংযুক্ত থাকে তবে সঠিক উত্তর দেওয়ার নিশ্চয়তা নেই etc.


কানেকশন_ফিল_পথ = কার্নেল.গেট_কনকেশন_ফায়াল () আর কাজ করে না, ফাইলের নামটি আরগ দরকার।
পূরেল

4
কিছু আপডেট: from IPython.lib import kernelএখনকার পরিবর্তে এটি ঠিক from IPython import kernel। অভিধানগুলিতে কী 'নাম' ব্যবহার করার পরিবর্তে, 'পথ' কীটি ব্যবহার করুন
ট্রিস্টান রিড

4
উত্তরদাতা নিজেই যেমন বিজ্ঞাপন দিয়েছিলেন, এই উত্তরটি সর্বশেষ আইপিথনের জন্য কাজ করে না। আমি এমন একটি সংস্করণ তৈরি করেছি যা পাইথন in.৫-তে আইপিথন ৪.২.০ নিয়ে কাজ করছে বলে মনে হয়েছে: gist.github.com/mbdevpl/f97205b73610dd30254652e7817f99cb
এমবিদেপল

4
সংস্করণ ৪.৩.০ হিসাবে আপনার একটি লেখার টোকেন সরবরাহ করতে হবে। এটি ব্যবহার করে পুনরুদ্ধার করা যায় notebook.notebookapp.list_running_servers()
এজেটেড

4
যদি আপনার একাধিক সার্ভার চলমান থাকে তবে আপনি কার্নেলের প্যারেন্ট প্রক্রিয়াটি কোন পোর্টে শুনছে তা পরীক্ষা করতে পারেন, কোন সার্ভারের সাথে সংযোগ স্থাপন করতে হবে তা আপনাকে জানিয়ে দেওয়া উচিত (অথবা আপনি কেবলমাত্র প্রতিটি স্থানীয় জুপিটার সার্ভারের সাথে সংযোগ স্থাপন করতে পারেন এবং আপনার কার্নেলটি চালাচ্ছেন কিনা তা পরীক্ষা করতে পারেন)।
ইঙ্গিত করা হয়েছে

41

আইপিথন ২.০ এর সাথে আমার নিম্নলিখিতগুলি রয়েছে। আমি লক্ষ করেন, নোটবুক নাম গুণাবলীর মান যেমন সংরক্ষণ করা হয় 'data-notebook-name'মধ্যে <body>পৃষ্ঠার ট্যাগ। সুতরাং এই ধারণাটি প্রথমে জাভাস্ক্রিপ্টকে এই বৈশিষ্ট্যটি পুনরুদ্ধার করতে বলবে - জাভাস্ক্রিপ্টগুলি যাদুটির জন্য একটি কোডসেল থেকে আহবান করা যেতে পারে %%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)

আউট []: হাওটোগেটথনেমঅফ দ্য নোটবুক.আইপিনব

এই সমাধানটির একটি ত্রুটি হ'ল যখন কেউ একটি নোটবুকের শিরোনাম (নাম) পরিবর্তন করে, তখন মনে হয় এই নামটি তাত্ক্ষণিকভাবে আপডেট করা হবে না (সম্ভবত কোনও ধরণের ক্যাশে রয়েছে) এবং অ্যাক্সেস পেতে নোটবুকটি পুনরায় লোড করা প্রয়োজন নতুন নাম.

[সম্পাদনা] প্রতিবিম্বে, আরও কার্যকর সমাধান হ'ল <body>ট্যাগের পরিবর্তে নোটবুকের নামের জন্য ইনপুট ক্ষেত্রটি সন্ধান করা । উত্সটি অনুসন্ধান করলে দেখা যায় যে এই ক্ষেত্রটিতে আইডি "নোটবুক_নাম" রয়েছে। তখন এটি দ্বারা এটির মানটি ধরা সম্ভবdocument.getElementById() এবং তারপরে উপরের মত একই পদ্ধতির অনুসরণ করা । কোডটি এখনও জাভাস্ক্রিপ্ট ম্যাজিক ব্যবহার করে using

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

তারপরে, একটি আইপথন সেল থেকে,

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

প্রথম সমাধানের বিপরীতে, নোটবুকের নামগুলি তত্ক্ষণাত আপডেট করা হয়েছে এবং নোটবুকটি রিফ্রেশ করার দরকার নেই is


হয়তো আমি কিছু মিস করেছি তবে আপনি কীভাবে অজগর থেকে জাভাস্ক্রিপ্ট কোডটি ব্যবহার করবেন?
আর্টজম বি

7
জাভাস্ক্রিপ্ট অবজেক্টের মতো প্রয়োগ করা ডিসপ্লের পদ্ধতিটি ব্যবহার করে অজগর থেকে জাভাস্ক্রিপ্ট কল করা সম্ভবdef getname(): display(Javascript('IPython.notebook.kernel.execute("theNotebook = " + "\'"+IPython.notebook.notebook_name+"\'");'))
Jakob

নোটবুকের পাথ পেতে আমি কীভাবে এটি সংশোধন করব?
পেড্রো এম ডুয়ার্টে

@ পেড্রোমডুয়ার্ট: আপনি মানটি পেতে উপরের স্ক্রিপ্টে 'থিয়েম' এর জন্য জাভাস্ক্রিপ্টে আইপাইটন.নোটবুক.নোটবুক_পথ ব্যবহার করতে পারেন।
ত্রিস্তান রিড

4
জেএস কৌতুকবিহীন নোটবুকের পথটি পেতে:globals()['_dh'][0]
জীবাণু

38

পূর্ববর্তী উত্তর যুক্ত,

নোটবুকের নামটি ঘরে ঘরে নিম্নলিখিত চালনার জন্য:

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

এটি আপনাকে এনবি_নেমে নাম দেয় name

তারপরে পুরো পথটি পেতে আপনি একটি পৃথক কক্ষে নিম্নলিখিত ব্যবহার করতে পারেন:

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

4
এটি ব্যবহার IPython.notebook.notebook_nameকরে ব্যবহার করা যায়%%javascript IPython.notebook.kernel.execute('notebookName = ' + '"' + IPython.notebook.notebook_name + '"')
jfb

10
কিছু কারণে এটি কেবল তখনই কাজ করে যদি আমি জাভাস্ক্রিপ্ট সেলটি "ম্যানুয়ালি" চালাই। আমি যদি পূর্ণ নোটবুকটি চালিত করি তবে দ্বিতীয় ঘরটি ব্যর্থ হয়। কোন ধারণা কেন?
পিয়েরে-এন্টোইন

আমি কোনও কারণে অনুমান করি, জাভাস্ক্রিপ্ট থেকে যদি কোনও ভেরিয়েবল পরিবর্তন করা হয় তবে একই কলটিতে খাঁটি অজগর থেকে অ্যাক্সেস করা হয়, পাইথন সংস্করণটি আপডেটটি দেখতে পায় না এবং জাভাস্ক্রিপ্ট সংস্করণটিও প্রতিস্থাপন করে। সুতরাং আমি অনুমান করি আপনি জাভাস্ক্রিপ্ট সেলটি শীর্ষে সরিয়ে নিতে পারেন, এটিকে চালিয়ে দিতে পারেন, তারপরে "সেল> রান অল বেলো" ব্যবহার করুন।
মাহমুদ এলাগদার

4
আমাদের আসলে জাভাস্ক্রিপ্টের দরকার কী? আর কি নেটিভ কিছু না?
ম্যাটানস্টার

4
Javascript Error: IPython is not defined
বৃহস্পতিবার

27

জুপিটার 3.0 এ নিম্নলিখিত কাজগুলি করে। এখানে আমি জপিটার সার্ভারে পুরো পথটি দেখছি, কেবল নোটবুকের নাম নয়:

দোকান থেকে 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

4
এটি খুব পরিষ্কার। আপনি তখন পাইথন ফাংশন থেকে জাভাস্ক্রিপ্ট কোড কল করবেন?
লুকাশ

হুমমম ... সম্ভবত সে ক্ষেত্রে আপনার বন্দর নম্বরটি অনুসরণ করে একটি কোলন দিয়ে বন্দর যুক্ত করা উচিত?
সাফানিয়াহ গ্রানশ্লাগ

4
এটি আপেক্ষিক পথ পূর্ণ পথ নয়
আইভেলিন

এটিতেও এর সেটিং অন্তর্ভুক্ত নয় c.NotebookApp.notebook_dir
sappjw

4
আমি হচ্ছি Javascript Error: IPython is not defined। আমি জাভাস্ক্রিপ্টের জন্য
আইপিথন

26

দেখে মনে হচ্ছে আমি মন্তব্য করতে পারছি না, সুতরাং উত্তর হিসাবে আমাকে এটি পোস্ট করতে হবে।

@Iguananaut দ্বারা গৃহীত সমাধান এবং @mbdevpl দ্বারা আপডেটটি নোটবুকের সাম্প্রতিক সংস্করণগুলির সাথে কাজ করছে না বলে মনে হচ্ছে। আমি নীচে প্রদর্শিত হিসাবে এটি স্থির। আমি এটি পাইথন v3.6.1 + নোটবুক v5.0.0 এবং পাইথন v3.6.5 এবং নোটবুক v5.5.0 এ পরীক্ষা করেছি।

from notebook import notebookapp
import urllib
import json
import os
import ipykernel

def notebook_path():
    """Returns the absolute path of the Notebook or None if it cannot be determined
    NOTE: works only when the security is token-based or there is also no password
    """
    connection_file = os.path.basename(ipykernel.get_connection_file())
    kernel_id = connection_file.split('-', 1)[1].split('.')[0]

    for srv in notebookapp.list_running_servers():
        try:
            if srv['token']=='' and not srv['password']:  # No token and no password, ahem...
                req = urllib.request.urlopen(srv['url']+'api/sessions')
            else:
                req = urllib.request.urlopen(srv['url']+'api/sessions?token='+srv['token'])
            sessions = json.load(req)
            for sess in sessions:
                if sess['kernel']['id'] == kernel_id:
                    return os.path.join(srv['notebook_dir'],sess['notebook']['path'])
        except:
            pass  # There may be stale entries in the runtime directory 
    return None

ডক্ট্রিং-এ যেমন বলা হয়েছে, এটি কেবল তখনই কাজ করে যখন হয় কোনও প্রমাণীকরণ নেই বা প্রমাণীকরণ টোকেন-ভিত্তিক।

মনে রাখবেন, অন্যরা যেমন রিপোর্ট করেছে, জাভাস্ক্রিপ্ট-ভিত্তিক পদ্ধতিটি "সমস্ত ঘর চালান" চালনার সময় কাজ করে বলে মনে হচ্ছে না (তবে "ম্যানুয়ালি" সেলগুলি কার্যকর করার সময় কাজ করে), যা আমার জন্য একটি চুক্তি-ব্রেকার ছিল।


এই জন্য কোন লাইব্রেরি আছে?
ম্যাটানস্টার

জাভাস্ক্রিপ্ট পদ্ধতিগুলির ব্যর্থতা আমার জন্যও একটি চুক্তি-বিভক্ত ছিল। এই বিকল্প পোস্ট করার জন্য ধন্যবাদ!
আড়ম্বর

আমাকে srv ['নোটবুক_ডির'] এর সাথে জুপিটার_কোর.প্যাথগুলি জুপিটার_কনফিগ_ডির আমদানি করতে হবে; traitlets.config আমদানি কনফিগার থেকে; সি = কনফিগার (); file_path = os.path.join (jupyter_config_dir (), 'jupyter_notebook_config.py'); এক্সিকিউট (ওপেন (ফাইল_পথ)। রিড ()); রুট_ডির = সি ['ফাইলসন্টেন্টস ম্যানেজার'] ['রুট_ডির']
ডেভ বাবিট

15

Ipyparams প্যাকেজ চমত্কার সহজে এটা করতে পারেন।

import ipyparams
currentNotebook = ipyparams.notebook_name

4
এটি শীর্ষে স্বীকৃত উত্তরটির চেয়ে ভাল উত্তর বলে মনে হচ্ছে।
আলেজান্দ্রো

1

ধরে নিচ্ছি আপনার কাছে জুপিটার নোটবুক সার্ভারের হোস্ট, পোর্ট এবং প্রমাণীকরণ টোকেন রয়েছে, এটি আপনার পক্ষে কাজ করা উচিত। এটি এই উত্তরের ভিত্তিতে তৈরি ।

import os
import json
import posixpath
import subprocess
import urllib.request
import psutil

def get_notebook_path(host, port, token):
    process_id = os.getpid();
    notebooks = get_running_notebooks(host, port, token)
    for notebook in notebooks:
        if process_id in notebook['process_ids']:
            return notebook['path']

def get_running_notebooks(host, port, token):
    sessions_url = posixpath.join('http://%s:%d' % (host, port), 'api', 'sessions')
    sessions_url += f'?token={token}'
    response = urllib.request.urlopen(sessions_url).read()
    res = json.loads(response)
    notebooks = [{'kernel_id': notebook['kernel']['id'],
                  'path': notebook['notebook']['path'],
                  'process_ids': get_process_ids(notebook['kernel']['id'])} for notebook in res]
    return notebooks

def get_process_ids(name):
    child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, shell=False)
    response = child.communicate()[0]
    return [int(pid) for pid in response.split()]

ব্যবহারের উদাহরণ:

get_notebook_path('127.0.0.1', 17004, '344eb91bee5742a8501cc8ee84043d0af07d42e7135bed90')

0

এখনও আমার নোটবুক সার্ভার পরিবর্তন হতে পারে অন্য একটি হ্যাকি সমাধান। মূলত আপনি একটি এলোমেলো স্ট্রিং মুদ্রণ করুন, এটি সংরক্ষণ করুন এবং তারপরে ওয়ার্কিং ডিরেক্টরিতে সেই স্ট্রিং যুক্ত একটি ফাইল অনুসন্ধান করুন। কিছুক্ষণ প্রয়োজন কারণ সেভ_চেকপয়েন্টটি অ্যাসিনক্রোনাস।

from time import sleep
from IPython.display import display, Javascript
import subprocess
import os
import uuid

def get_notebook_path_and_save():
    magic = str(uuid.uuid1()).replace('-', '')
    print(magic)
    # saves it (ctrl+S)
    display(Javascript('IPython.notebook.save_checkpoint();'))
    nb_name = None
    while nb_name is None:
        try:
            sleep(0.1)
            nb_name = subprocess.check_output(f'grep -l {magic} *.ipynb', shell=True).decode().strip()
        except:
            pass
    return os.path.join(os.getcwd(), nb_name)

0

সমস্ত জসন ভিত্তিক সমাধানগুলি যদি আমরা একসাথে একাধিক সেল প্রয়োগ করি তবে ব্যর্থ হয় কারণ কার্যকর করা শেষ না হওয়া পর্যন্ত ফলাফল প্রস্তুত হবে না (এটি ঘুম ব্যবহার বা কোনও সময় অপেক্ষা করার বিষয়টি নয়, নিজে এটি পরীক্ষা করে দেখুন তবে কার্নেলটি পুনরায় আরম্ভ করতে ভুলবেন না এবং সমস্ত পরীক্ষা চালান)

পূর্ববর্তী সমাধানগুলির উপর ভিত্তি করে, আপনি যদি এটিকে অন্য কোনও কোডের মাঝে রাখার প্রয়োজন হয় তবে এটি %% যাদুটি ব্যবহার করা এড়ানো হবে:

from IPython.display import display, Javascript

# can have comments here :)
js_cmd = 'IPython.notebook.kernel.execute(\'nb_name = "\' + IPython.notebook.notebook_name + \'"\')'
display(Javascript(js_cmd))

অজগর 3 এর জন্য, @ আইগানানৌতের উত্তরগুলির ভিত্তিতে নীচে এবং সর্বশেষতম অজগরটির জন্য আপডেট করা হয়েছে এবং সম্ভবত একাধিক সার্ভার কাজ করবে:

import os
import json
try:
    from urllib2 import urlopen
except:
    from urllib.request import urlopen
import ipykernel

connection_file_path = ipykernel.get_connection_file()
connection_file = os.path.basename(connection_file_path)
kernel_id = connection_file.split('-', 1)[1].split('.')[0]    
    
running_servers = !jupyter notebook list
running_servers = [s.split('::')[0].strip() for s in running_servers[1:]]
nb_name = '???'
for serv in running_servers:
    uri_parts = serv.split('?')
    uri_parts[0] += 'api/sessions'
    sessions = json.load(urlopen('?'.join(uri_parts)))
    for sess in sessions:
        if sess['kernel']['id'] == kernel_id:
            nb_name = os.path.basename(sess['notebook']['path'])
            break
    if nb_name != '???':
        break
print (f'[{nb_name}]')
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.