আমার কাছে পাইথন কোডের কয়েকটি উদাহরণ রয়েছে যা আমি শেয়ার করতে চাই যা পাইথন / আইপিথন টার্মিনাল বা আইপিথন নোটবুকে কার্যকর হলে কিছু আলাদা করা উচিত।
আমার পাইথন কোডটি আইপিথন নোটবুকটিতে চলছে কিনা আমি কীভাবে তা পরীক্ষা করতে পারি?
আমার কাছে পাইথন কোডের কয়েকটি উদাহরণ রয়েছে যা আমি শেয়ার করতে চাই যা পাইথন / আইপিথন টার্মিনাল বা আইপিথন নোটবুকে কার্যকর হলে কিছু আলাদা করা উচিত।
আমার পাইথন কোডটি আইপিথন নোটবুকটিতে চলছে কিনা আমি কীভাবে তা পরীক্ষা করতে পারি?
উত্তর:
প্রশ্নটি কী আপনি ভিন্নভাবে কার্যকর করতে চান?
আমরা আইপিথনে যথাসাধ্য চেষ্টা করি যে কার্নেলটি কোন ধরণের ফ্রন্টএন্ড সংযুক্ত তা জেনে যাওয়া থেকে বিরত রাখে এবং বাস্তবে আপনি একই সাথে অনেকগুলি পৃথক সীমারেখার সাথেও একটি কার্নেল যুক্ত থাকতে পারেন। এমনকি আপনি stderr/out
জেডএমকিউ কার্নেলের মধ্যে আছেন কিনা তা জানার ধরণটি যদি আপনি দেখতে পারেন তবে তা অন্যদিকে আপনার কী আছে তা আপনাকে গ্যারান্টি দেয় না। এমনকি আপনার কোনও সামনের অংশও থাকতে পারে না।
আপনার কোডটি সম্ভবত সীমান্তের স্বতন্ত্র পদ্ধতিতে লিখতে হবে, তবে আপনি যদি বিভিন্ন জিনিস প্রদর্শন করতে চান তবে আপনি সমৃদ্ধ ডিসপ্লে সিস্টেমটি ব্যবহার করতে পারেন (আইপিথনের সংস্করণ 4.x সংস্করণে লিঙ্ক করা) সীমান্তের উপর নির্ভর করে বিভিন্ন জিনিস প্রদর্শন করতে পারেন তবে সামনের অংশটি লাইব্রেরি নয়, বেছে নেবে।
\x1b[A
(সরানো) সমর্থন করে না , তাই নেস্টেড বারগুলি মুদ্রণ করা সম্ভব নয় । আইপিউজেডগুলির সাথে কোনও সমস্যা নেই , আমরা অগ্রগতি বারগুলি প্রদর্শনের জন্য নেটিভ জুপিটার উইজেটগুলি ব্যবহার করতে পারি। তবে তারপরে আমাদের কাছে একটি অগ্রগতি বারটি প্রদর্শনের দুটি ভিন্ন উপায় রয়েছে এবং একটি অ্যাপ্লিকেশনটি উপযুক্ত পরিবেশটিকে খাপ খাইয়ে নিতে এবং প্রিন্ট করতে ডিসপ্লে পরিবেশটি কী তা জানতে চাইতে পারে।
%matplotlib inline
যখন এটি নোটবুক হিসাবে কাজ করে তবে টার্মিনালে নয়, যেহেতু এটির প্রয়োজন হয় না।
নিম্নলিখিত আমার প্রয়োজনের জন্য কাজ করেছে:
get_ipython().__class__.__name__
এটি 'TerminalInteractiveShell'
টার্মিনাল আইপিথনে, 'ZMQInteractiveShell'
জুপিটারে (নোটবুক এবং কিউটকনসোল) ফিরে আসে এবং NameError
নিয়মিত পাইথন ইন্টারপ্রেটারে ব্যর্থ হয় ( )। get_python()
আইপিথন শুরু হওয়ার পরে পদ্ধতিটি ডিফল্টরূপে বিশ্বব্যাপী নেমস্পেসে উপলব্ধ বলে মনে হয়।
একটি সাধারণ ফাংশন এ এটি মোড়ানো:
def isnotebook():
try:
shell = get_ipython().__class__.__name__
if shell == 'ZMQInteractiveShell':
return True # Jupyter notebook or qtconsole
elif shell == 'TerminalInteractiveShell':
return False # Terminal running IPython
else:
return False # Other type (?)
except NameError:
return False # Probably standard Python interpreter
উপরেরটি পাইথন ৩.৩.২, আইপিথন ৫.১.০ এবং জুপিটার ৪.২.১ সাথে ম্যাকওএস ১০.১২ এবং উবুন্টু ১৪.০৪.৪ এলটিএসে পরীক্ষা করা হয়েছিল
jupyter console
, দুর্ভাগ্যক্রমে এরও get_ipython()
একটি উদাহরণ ZMQInteractiveShell
দেয়
get_ipython().__class__.__module__ == "google.colab._shell"
test.py
তবে from test import isnotebook; print(isnotebook())
একটি বৃহত্তর নোটবুকটিতে চালান , এটি মুদ্রণ করে True
। (নোটবুক সার্ভার সংস্করণ 5.2.1 এবং 6.0.1 এ পরীক্ষিত।)
আপনি কোনও নোটবুকে রয়েছেন কিনা তা যাচাই করার জন্য, যা গুরুত্বপূর্ণ হতে পারে যেমন কোন ধরণের প্রগতিবারটি ব্যবহার করবেন তা নির্ধারণ করার সময়, এটি আমার পক্ষে কাজ করেছে:
def in_ipynb():
try:
cfg = get_ipython().config
if cfg['IPKernelApp']['parent_appname'] == 'ipython-notebook':
return True
else:
return False
except NameError:
return False
cfg['IPKernelApp']['parent_appname']
একটি IPython.config.loader.LazyConfigValue
, যা এর True
সাথে তুলনা করে না"iypthon-notebook"
IPython.kernel.zmq.zmqshell.ZMQInteractiveShell
(Jupyter) এবং IPython.terminal.interactiveshell.TerminalInteractiveShell
একটি টার্মিনাল REPL এ একটি উদাহরণ দেয় , যদি আপনাকে নোটবুক এবং টার্মিনাল / কনসোলগুলির মধ্যে পার্থক্য করতে হয় (যা প্লটিংকে প্রভাবিত করে)।
try
return str(type(get_ipython())) == "<class 'ipykernel.zmqshell.ZMQInteractiveShell'>"
shell='PyDevTerminalInteractiveShell'
বর্গের নামটি পরীক্ষা করার সময় আমি পাই I
নিম্নলিখিত স্নিপেটের সাথে পাইথন ইন্টারেক্টিভ মোডে রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন [1] :
def is_interactive():
import __main__ as main
return not hasattr(main, '__file__')
আমি এই পদ্ধতিটি খুব দরকারী বলে খুঁজে পেয়েছি কারণ আমি নোটবুকে প্রচুর প্রোটোটাইপিং করি। পরীক্ষার উদ্দেশ্যে, আমি ডিফল্ট পরামিতি ব্যবহার করি। অন্যথায়, আমি প্যারামিটারগুলি পড়েছি sys.argv
।
from sys import argv
if is_interactive():
params = [<list of default parameters>]
else:
params = argv[1:]
এর বাস্তবায়ন অনুসরণ করে autonotebook
আপনি নীচের কোডটি ব্যবহার করে কোনও নোটবুকে রয়েছেন কিনা তা বলতে পারবেন।
def in_notebook():
try:
from IPython import get_ipython
if 'IPKernelApp' not in get_ipython().config: # pragma: no cover
return False
except ImportError:
return False
return True
is_interactive()
নোটবুক এবং কনসোলের মধ্যে পার্থক্য করে না।
%run
আইপিথন থেকে একটি জারি করা অন্য ইন্টারঅ্যাকটিভ। আপনি এটি যুক্তি দিতে পারেন, তবে এটি এখনও একটি গেটচা।
is_interactive
) আমার কাছে প্রশ্নের মূলত অপ্রাসঙ্গিক বলে মনে হচ্ছে। এটি সন্দেহজনক সঠিকতারও; @ মার্সচার যেমন উল্লেখ করেছেন, এটি python -c
সত্য না হলেও "ইন্টারেক্টিভ" মোডে ব্যবহার করে যে কোনও রান চালানো গণনা করে । এটি আমার উত্তর না হওয়ায় আমি নিজেই এটি করতে চাই না, তবে আমি মনে করি কেবল উত্তরটির পুরো প্রথমার্ধটি মুছে ফেলে এটি উন্নত হবে।
সম্প্রতি আমি জুপিটার নোটবুকটিতে একটি বাগের মুখোমুখি হয়েছি যার জন্য একটি কার্যপ্রণালী প্রয়োজন এবং আমি অন্যান্য শেলগুলিতে কার্যকারিতা হারিয়ে না ফেলে এটি করতে চেয়েছিলাম। আমি বুঝতে পেরেছি যে কেফ্লাভিচের সমাধান এই ক্ষেত্রে কাজ করে না, কারণ get_ipython()
কেবলমাত্র নোটবুক থেকে পাওয়া যায়, আমদানি করা মডিউলগুলি থেকে নয়। সুতরাং আমি আমার মডিউলটি এটি জুপিটার নোটবুক থেকে আমদানি করা এবং ব্যবহৃত কিনা তা সনাক্ত করার একটি উপায় খুঁজে পেয়েছি:
import sys
def in_notebook():
"""
Returns ``True`` if the module is running in IPython kernel,
``False`` if in IPython shell or other Python shell.
"""
return 'ipykernel' in sys.modules
# later I found out this:
def ipython_info():
ip = False
if 'ipykernel' in sys.modules:
ip = 'notebook'
elif 'IPython' in sys.modules:
ip = 'terminal'
return ip
মন্তব্য যথেষ্ট প্রশংসনীয় যদি প্রশংসা করা হয়।
একইভাবে ক্লায়েন্ট এবং আইপিথন সংস্করণ সম্পর্কে কিছু তথ্য পাওয়া সম্ভব:
import sys
if 'ipykernel' in sys.modules:
ip = sys.modules['ipykernel']
ip_version = ip.version_info
ip_client = ip.write_connection_file.__module__.split('.')[0]
# and this might be useful too:
ip_version = IPython.utils.sysinfo.get_sys_info()['ipython_version']
'Ipython' in sys.modules
মূল্যায়ন করছি False
। সম্ভবত আপনি বলতে চান 'IPython' in sys.modules
? এটি True
আমার জুপিটার পরিবেশে। sys.modules
অভিধান এছাড়াও অন্তর্ভুক্ত নয় 'ipykernel'
কী - যখন একটি নোটবুক ভিতরে চলছে।
অজগর জন্য পরীক্ষিত 3.7.3
সিটিথন বাস্তবায়নের নামটি __builtins__
তাদের গ্লোবালগুলির অংশ হিসাবে উপলব্ধ রয়েছে যা বিটিডব্লিউ। ফাংশন গ্লোবাল () দ্বারা পুনরুদ্ধার করা যেতে পারে।
আইপিথন পরিবেশে যদি কোনও স্ক্রিপ্ট চলমান থাকে তবে এর __IPYTHON__
একটি বৈশিষ্ট্য হওয়া উচিত __builtins__
।
তাই নীচের কোডটি True
আইপিথনের অধীনে চালিত হলে তা দেয় বা অন্যথায় দেয়False
hasattr(__builtins__,'__IPYTHON__')
নিম্নলিখিতগুলির আউটপুট পার্স করার প্রয়োজন ছাড়াই https://stackoverflow.com/a/50234148/1491619 এর কেসগুলি ক্যাপচার করেps
def pythonshell():
"""Determine python shell
pythonshell() returns
'shell' (started python on command line using "python")
'ipython' (started ipython on command line using "ipython")
'ipython-notebook' (e.g., running in Spyder or started with "ipython qtconsole")
'jupyter-notebook' (running in a Jupyter notebook)
See also https://stackoverflow.com/a/37661854
"""
import os
env = os.environ
shell = 'shell'
program = os.path.basename(env['_'])
if 'jupyter-notebook' in program:
shell = 'jupyter-notebook'
elif 'JPY_PARENT_PID' in env or 'ipython' in program:
shell = 'ipython'
if 'JPY_PARENT_PID' in env:
shell = 'ipython-notebook'
return shell
jupyter
কিনা এটি একটি jupyter console
, jupyter qtconsole
বা jupyter notebook
।
আমি নির্দিষ্ট ফ্রন্টএন্ড সনাক্ত করতে এড়িয়ে চলার পরামর্শ দেব কারণ সেগুলির মধ্যে অনেকগুলি রয়েছে । পরিবর্তে আপনি কেবল আইপিথন পরিবেশের মধ্যে থেকে চালাচ্ছেন কিনা তা পরীক্ষা করতে পারেন:
def is_running_from_ipython():
from IPython import get_ipython
return get_ipython() is not None
False
আপনি যদি running_from_ipython
সাধারণ পাইথন কমান্ড লাইন থেকে আবেদন করেন তবে উপরে ফিরে আসবেন । আপনি যখন এটি জুপিটার নোটবুক, জুপিটারহাব, আইপিথন শেল, গুগল কোলাব ইত্যাদি থেকে প্রার্থনা করবেন তখন তা ফিরে আসবে True
।
get_ipython()
ফিরে আসে <ipykernel.zmqshell.ZMQInteractiveShell at 0x7f750ba94320>
।
get_ipython() is not None
ফিরে আসব True
।
আপনাকে যা করতে হবে তা হ'ল আপনার নোটবুকের শুরুতে এই দুটি ঘর স্থাপন করা:
সেল 1: ("কোড" হিসাবে চিহ্নিত):
is_notebook = True
সেল 2: ("কাঁচা এনবিসি রূপান্তর" হিসাবে চিহ্নিত):
is_notebook = False
প্রথম ঘরটি সর্বদা কার্যকর করা হবে তবে আপনি যখন পাইথন স্ক্রিপ্ট হিসাবে নোটবুকটি রফতানি করবেন তখন দ্বিতীয় ঘরটি কেবল কার্যকর হবে।
পরে, আপনি যাচাই করতে পারেন:
if is_notebook:
notebook_code()
else:
script_code()
আশাকরি এটা সাহায্য করবে.
কিভাবে ভালো কিছু সম্পর্কে:
import sys
inJupyter = sys.argv[-1].endswith('json')
print(inJupyter);
যতদূর আমি জানি, এখানে 3 ধরণের আইপিথন ব্যবহৃত হয়েছে ipykernel
ipython qtconsole
(সংক্ষেপে "কিটিপিথন")ব্যবহার 'spyder' in sys.modules
স্পাইডার পার্থক্য করতে পারে
তবে কটিপিথন এবং জেএন এর পক্ষে কারণকে আলাদা করা শক্ত
তাদের একই sys.modules
এবং একই আইপিথন কনফিগারেশন রয়েছে:get_ipython().config
আমি কিটিপিথন এবং জেএন-র মধ্যে একটি আলাদা খুঁজে পাই:
os.getpid()
আইপিথন শেলের প্রথম রান পিড নম্বর পাবেন
তারপর চালান ps -ef|grep [pid number]
আমার কোটিপিথন পিডটি 8699
yanglei 8699 8693 4 20:31 ? 00:00:01 /home/yanglei/miniconda2/envs/py3/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-8693.json
আমার জেন পিড 8832
yanglei 8832 9788 13 20:32 ? 00:00:01 /home/yanglei/miniconda2/bin/python -m ipykernel_launcher -f /run/user/1000/jupyter/kernel-ccb962ec-3cd3-4008-a4b7-805a79576b1b.json
কটিপাইথন এবং জেএন-এর আলাদা আলাদা আলাদা নাম হ'ল আইপথনের জসন নাম, জেএন-এর জসন নামটি কটিপিথনের চেয়ে দীর্ঘ
সুতরাং, আমরা নিম্নলিখিত কোডের মাধ্যমে সমস্ত পাইথন পরিবেশটি স্বয়ংক্রিয়ভাবে সনাক্ত করতে পারি:
import sys,os
def jupyterNotebookOrQtConsole():
env = 'Unknow'
cmd = 'ps -ef'
try:
with os.popen(cmd) as stream:
if not py2:
stream = stream._stream
s = stream.read()
pid = os.getpid()
ls = list(filter(lambda l:'jupyter' in l and str(pid) in l.split(' '), s.split('\n')))
if len(ls) == 1:
l = ls[0]
import re
pa = re.compile(r'kernel-([-a-z0-9]*)\.json')
rs = pa.findall(l)
if len(rs):
r = rs[0]
if len(r)<12:
env = 'qtipython'
else :
env = 'jn'
return env
except:
return env
pyv = sys.version_info.major
py3 = (pyv == 3)
py2 = (pyv == 2)
class pyi():
'''
python info
plt : Bool
mean plt avaliable
env :
belong [cmd, cmdipython, qtipython, spyder, jn]
'''
pid = os.getpid()
gui = 'ipykernel' in sys.modules
cmdipython = 'IPython' in sys.modules and not gui
ipython = cmdipython or gui
spyder = 'spyder' in sys.modules
if gui:
env = 'spyder' if spyder else jupyterNotebookOrQtConsole()
else:
env = 'cmdipython' if ipython else 'cmd'
cmd = not ipython
qtipython = env == 'qtipython'
jn = env == 'jn'
plt = gui or 'DISPLAY' in os.environ
print('Python Envronment is %s'%pyi.env)
উত্স কোডটি এখানে রয়েছে: পাইথন পরিবেশ সনাক্তকরণ, বিশেষত স্পাইডার, জুপিটার নোটবুক, Qtconsole.py পার্থক্য করুন
আইপিথন চালু করতে আমি জ্যাঙ্গো শেল প্লাস ব্যবহার করছি এবং আমি জাজানো সেটিংস মান হিসাবে 'নোটবুক চালানো' উপলব্ধ করতে চেয়েছিলাম। get_ipython()
সেটিংস লোড করার সময় উপলভ্য নয়, তাই আমি এটি ব্যবহার করি (যা বুলেটপ্রুফ নয়, তবে এটি যে স্থানীয় উন্নয়নের পরিবেশে ব্যবহৃত হয় তার পক্ষে যথেষ্ট ভাল):
import sys
if '--notebook' in sys.argv:
ENVIRONMENT = "notebook"
else:
ENVIRONMENT = "dev"
ধরে নিই যে আপনি জুপিটার নোটবুকের নিয়ন্ত্রণ রাখতে পারেন:
এমন কোনও ঘরে একটি পরিবেশ মান সেট করুন যা এটি আপনার কোডে পতাকা হিসাবে ব্যবহার করে । সেই ঘরে একটি অনন্য মন্তব্য রাখুন (বা আপনি যে সমস্ত ঘর বাদ দিতে চান)
# বাদ দিন_ফর্ম_এক্সপোর্ট
% সেট_ইন_জুপাইটার = 1
নোটবুকটি অন্য প্রসঙ্গে ব্যবহার করতে পাইথন স্ক্রিপ্ট হিসাবে রফতানি করুন। রফতানিতে মন্তব্য করা ঘর (গুলি) এবং পরবর্তীকালে কোডটি পরিবেশ মান নির্ধারণ করে। দ্রষ্টব্য: আপনার আসল নোটবুক ফাইলের নামের সাথে your_notebook.ipynb প্রতিস্থাপন করুন।
jupyter nbconvert --to স্ক্রিপ্ট --RegexRemovePreprocessor. Patterns = "['' # বাদ দিন_ফর্ম_এক্সপোর্ট ']" আপনার_নোটবুক.আইপিনব
এটি এমন একটি ফাইল তৈরি করবে যাতে জুপির পরিবেশ পতাকা পতাকা সেট কোডের জন্য মঞ্জুরি দেয় না যা এটি নির্বিচারে কার্যকর করতে ব্যবহার করে।