আইপিথন নোটবুক চালানোর সময় আমি বর্তমান নোটবুকের নামটি পাওয়ার চেষ্টা করছি। আমি জানি আমি এটি নোটবুকের শীর্ষে দেখতে পাচ্ছি। আমি কিছু পরে কি করছি
currentNotebook = IPython.foo.bar.notebookname()
আমার একটি ভেরিয়েবলের নাম পাওয়া দরকার।
আইপিথন নোটবুক চালানোর সময় আমি বর্তমান নোটবুকের নামটি পাওয়ার চেষ্টা করছি। আমি জানি আমি এটি নোটবুকের শীর্ষে দেখতে পাচ্ছি। আমি কিছু পরে কি করছি
currentNotebook = IPython.foo.bar.notebookname()
আমার একটি ভেরিয়েবলের নাম পাওয়া দরকার।
pip install ipynbname
উত্তর:
ইতিমধ্যে উল্লিখিত হিসাবে আপনি সম্ভবত এটি করতে সক্ষম হবেন বলে মনে করা হচ্ছে না, তবে আমি একটি উপায় খুঁজে পেয়েছি। এটি একটি জ্বলন্ত হ্যাক যদিও এর উপর একেবারেই নির্ভর করবেন না:
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.
from IPython.lib import kernel
এখনকার পরিবর্তে এটি ঠিক from IPython import kernel
। অভিধানগুলিতে কী 'নাম' ব্যবহার করার পরিবর্তে, 'পথ' কীটি ব্যবহার করুন
notebook.notebookapp.list_running_servers()
।
আইপিথন ২.০ এর সাথে আমার নিম্নলিখিতগুলি রয়েছে। আমি লক্ষ করেন, নোটবুক নাম গুণাবলীর মান যেমন সংরক্ষণ করা হয় '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
def getname(): display(Javascript('IPython.notebook.kernel.execute("theNotebook = " + "\'"+IPython.notebook.notebook_name+"\'");'))
globals()['_dh'][0]
পূর্ববর্তী উত্তর যুক্ত,
নোটবুকের নামটি ঘরে ঘরে নিম্নলিখিত চালনার জন্য:
%%javascript
IPython.notebook.kernel.execute('nb_name = "' + IPython.notebook.notebook_name + '"')
এটি আপনাকে এনবি_নেমে নাম দেয় name
তারপরে পুরো পথটি পেতে আপনি একটি পৃথক কক্ষে নিম্নলিখিত ব্যবহার করতে পারেন:
import os
nb_full_path = os.path.join(os.getcwd(), nb_name)
IPython.notebook.notebook_name
করে ব্যবহার করা যায়%%javascript IPython.notebook.kernel.execute('notebookName = ' + '"' + IPython.notebook.notebook_name + '"')
Javascript Error: IPython is not defined
জুপিটার 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
c.NotebookApp.notebook_dir
।
Javascript Error: IPython is not defined
। আমি জাভাস্ক্রিপ্টের জন্য
দেখে মনে হচ্ছে আমি মন্তব্য করতে পারছি না, সুতরাং উত্তর হিসাবে আমাকে এটি পোস্ট করতে হবে।
@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
ডক্ট্রিং-এ যেমন বলা হয়েছে, এটি কেবল তখনই কাজ করে যখন হয় কোনও প্রমাণীকরণ নেই বা প্রমাণীকরণ টোকেন-ভিত্তিক।
মনে রাখবেন, অন্যরা যেমন রিপোর্ট করেছে, জাভাস্ক্রিপ্ট-ভিত্তিক পদ্ধতিটি "সমস্ত ঘর চালান" চালনার সময় কাজ করে বলে মনে হচ্ছে না (তবে "ম্যানুয়ালি" সেলগুলি কার্যকর করার সময় কাজ করে), যা আমার জন্য একটি চুক্তি-ব্রেকার ছিল।
Ipyparams প্যাকেজ চমত্কার সহজে এটা করতে পারেন।
import ipyparams
currentNotebook = ipyparams.notebook_name
ধরে নিচ্ছি আপনার কাছে জুপিটার নোটবুক সার্ভারের হোস্ট, পোর্ট এবং প্রমাণীকরণ টোকেন রয়েছে, এটি আপনার পক্ষে কাজ করা উচিত। এটি এই উত্তরের ভিত্তিতে তৈরি ।
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')
এখনও আমার নোটবুক সার্ভার পরিবর্তন হতে পারে অন্য একটি হ্যাকি সমাধান। মূলত আপনি একটি এলোমেলো স্ট্রিং মুদ্রণ করুন, এটি সংরক্ষণ করুন এবং তারপরে ওয়ার্কিং ডিরেক্টরিতে সেই স্ট্রিং যুক্ত একটি ফাইল অনুসন্ধান করুন। কিছুক্ষণ প্রয়োজন কারণ সেভ_চেকপয়েন্টটি অ্যাসিনক্রোনাস।
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)
সমস্ত জসন ভিত্তিক সমাধানগুলি যদি আমরা একসাথে একাধিক সেল প্রয়োগ করি তবে ব্যর্থ হয় কারণ কার্যকর করা শেষ না হওয়া পর্যন্ত ফলাফল প্রস্তুত হবে না (এটি ঘুম ব্যবহার বা কোনও সময় অপেক্ষা করার বিষয়টি নয়, নিজে এটি পরীক্ষা করে দেখুন তবে কার্নেলটি পুনরায় আরম্ভ করতে ভুলবেন না এবং সমস্ত পরীক্ষা চালান)
পূর্ববর্তী সমাধানগুলির উপর ভিত্তি করে, আপনি যদি এটিকে অন্য কোনও কোডের মাঝে রাখার প্রয়োজন হয় তবে এটি %% যাদুটি ব্যবহার করা এড়ানো হবে:
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}]')