(28 মে, 2016-এ আপডেট হওয়া) ইম্যাক্সে রিয়েলজিইউডি ব্যবহার করা
ইমাক্সের যে কারও জন্য, এই থ্রেডটি দেখায় যে কীভাবে ওপিতে বর্ণিত সমস্ত কিছু সম্পাদন করতে হয় (এবং আরও অনেক কিছু)
- ইমাক্সে নতুন একটি গুরুত্বপূর্ণ ডিবাগার রিয়েলজিইউডি নামে পরিচিত যা কোনও ডিবাগার (সহ
ipdb
) সহ পরিচালনা করতে পারে ।
- Emacs প্যাকেজ
isend-mode
।
এই দুটি প্যাকেজের সংমিশ্রণটি অত্যন্ত শক্তিশালী এবং এটিকে ওপিতে বর্ণিত সঠিক আচরণটি পুনরায় তৈরি করতে এবং আরও কিছু করার অনুমতি দেয়।
আইপিডিবির জন্য রিয়েলজিইউডি- র উইকি নিবন্ধের আরও তথ্য ।
আসল উত্তর:
এই থ্রেডে উল্লিখিত সমস্ত কিছু সহ পাইথনকে ডিবাগ করার জন্য অনেকগুলি ভিন্ন পদ্ধতির চেষ্টা করার পরে, আইপিথনের সাথে পাইথনটি ডিবাগ করার আমার পছন্দের একটি উপায় এম্বেড শেল সহ।
একটি কাস্টম এম্বেডেড আইপিথন শেল সংজ্ঞা দেওয়া:
আপনার কোনও স্ক্রিপ্টে নিম্নলিখিতগুলি যুক্ত করুন PYTHONPATH
, যাতে পদ্ধতিটি ipsh()
উপলব্ধ হয়।
import inspect
# First import the embed function
from IPython.terminal.embed import InteractiveShellEmbed
from IPython.config.loader import Config
# Configure the prompt so that I know I am in a nested (embedded) shell
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = ' .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '
# Messages displayed when I drop into and exit the shell.
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")
exit_msg = '**Leaving Nested interpreter'
# Wrap it in a function that gives me more context:
def ipsh():
ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)
frame = inspect.currentframe().f_back
msg = 'Stopped at {0.f_code.co_filename} at line {0.f_lineno}'.format(frame)
# Go back one level!
# This is needed because the call to ipshell is inside the function ipsh()
ipshell(msg,stack_depth=2)
তারপরে, যখনই আমি আমার কোডটিতে কোনও ডিবাগ করতে চাই, আমি ipsh()
ঠিক যেখানে ঠিক ততক্ষণ বস্তু পরিদর্শন করা প্রয়োজন সেখানে ঠিক ঠিক রেখেছি উদাহরণস্বরূপ, বলুন আমি my_function
নীচে ডিবাগ করতে চাই
এটি ব্যবহার করছি:
def my_function(b):
a = b
ipsh() # <- This will embed a full-fledged IPython interpreter
a = 4
এবং তারপরে আমি my_function(2)
নীচের একটি উপায়ে প্রার্থনা করছি :
- হয় পাইথন প্রোগ্রাম চালনা করে যা ইউনিক্স শেল থেকে এই ফাংশনটি আহ্বান করে
- অথবা সরাসরি আইপিথন থেকে অনুরোধ করে
আমি এটিকে যেভাবেই প্রার্থনা করি না কেন, দোভাষী যে লাইনে বলে তা বন্ধ করে দেয় ipsh()
। আপনার কাজ শেষ হয়ে গেলে, আপনি করতে পারেন Ctrl-D
এবং পাইথন পুনরায় প্রয়োগ শুরু করবে (আপনি যে কোনও পরিবর্তনশীল আপডেট দিয়েছিলেন)। উল্লেখ্য যে, যদি আপনি একটি নিয়মিত IPython IPython শেল থেকে কোড (কেস উপরে 2) চালানো, নতুন IPython শেল হবে নেস্টেড এক, যা পুরোপুরি জরিমানা যেখান থেকে আপনি এটা প্রার্থনা ভিতরে, কিন্তু এটা ভালো সচেতন হতে হবে। যেভাবেই, একবার অনুবাদকের অবস্থানের স্থানে থামার পরে ipsh
, আমি a
(যা হতে 2
) এর মানটি পরীক্ষা করতে পারি , কোন ফাংশন এবং অবজেক্টগুলি সংজ্ঞায়িত করা হয়েছে তা দেখুন etc.
সমস্যাটি:
উপরের সমাধানটি আপনার কোডের যে কোনও জায়গায় পাইথনটি থামাতে ব্যবহার করা যেতে পারে এবং তারপরে আপনাকে সম্পূর্ণ আইপিথন ইন্টারপ্রেটারে ফেলে দেয় drop দুর্ভাগ্যক্রমে এটি একবারে আপনি স্ক্রিপ্ট শুরু করলে ব্রেকপয়েন্টগুলি যুক্ত বা সরাতে দেয় না, যা অত্যন্ত হতাশাব্যঞ্জক। আমার মতে, এই একমাত্র জিনিসটি আইপথনকে পাইথনের জন্য একটি দুর্দান্ত ডিবাগিং সরঞ্জাম হয়ে উঠতে বাধা দিচ্ছে ।
আপাতত সেরা আপনি যা করতে পারেন:
ipsh()
আপনি যে পাইথন ইন্টারপ্রেটারকে আইপিথন শেল (যেমন ক breakpoint
) চালু করতে চান সেখানে বিভিন্ন স্থানে একটি প্রাইরি স্থাপন করা হয় A তারপরে আপনি বিভিন্ন প্রাক-সংজ্ঞায়িত, হার্ড-কোডড "ব্রেকপয়েন্টস" এর সাথে "লাফিয়ে" যেতে পারেন Ctrl-D
, যা বর্তমান এম্বেডড আইপিথন শেলটি থেকে প্রস্থান করবে এবং যখনই অনুবাদক পরবর্তী কলটিতে হিট করবে তখন আবার থামবে ipsh()
।
আপনি যদি এই রুটে যান, "ডিবাগিং মোড" থেকে প্রস্থান এবং পরবর্তী সমস্ত ব্রেকপয়েন্টগুলি উপেক্ষা করার একটি উপায় হ'ল ব্যবহার করা ipshell.dummy_mode = True
যা পাইথনকে ipshell
উপরে তৈরি করা বস্তুর পরবর্তী কোনও তাত্পর্যকে উপেক্ষা করবে ।
!
কমান্ড রয়েছে যা