আইপিথনের সাথে ধাপে ধাপে ডিবাগিং


170

আমি যা পড়েছি তা থেকে পাইথনে কোড ডিবাগ করার দুটি উপায় রয়েছে:

  • একটি ঐতিহ্যগত ডিবাগার সঙ্গে যেমন pdbবা ipdb। যেমন এই সমর্থন কমান্ড cজন্য continue, nজন্য step-over, sজন্য step-intoইত্যাদি), কিন্তু আপনি যা বস্তুর পরিদর্শনের জন্য অত্যন্ত উপযোগী হতে পারে একটি IPython শেল থেকে সরাসরি প্রবেশাধিকার হবে না।

  • ব্যবহার IPython দ্বারা এম্বেডিং আপনার কোডে একটি IPython শেল। আপনি করতে পারেন from ipython import embed, এবং তারপরে embed()আপনার কোডটি ব্যবহার করুন। যখন আপনার প্রোগ্রাম / স্ক্রিপ্ট কোনও embed()বিবৃতি হিট করে , তখন আপনাকে আইপিথন শেল থেকে ফেলে দেওয়া হয়। এটি সমস্ত আইপিথন গুডিজ ব্যবহার করে পাইজটনের কোডের সম্পূর্ণ পরিদর্শন এবং পরীক্ষার অনুমতি দেয়। যাইহোক, ব্যবহার করার সময় embed()আপনি সহজে কিবোর্ড শর্টকাটগুলি দিয়ে কোডের মাধ্যমে ধাপে ধাপে পারবেন না ।

উভয় বিশ্বের সেরা একত্রিত করার কোন উপায় আছে? অর্থাত

  1. হ্যান্ডি পিডিবি / আইপিডিবি কীবোর্ড শর্টকাটগুলির সাহায্যে আপনার কোডের মাধ্যমে ধাপে ধাপে সক্ষম হবেন ।
  2. এ জাতীয় যে কোনও পদক্ষেপে (যেমন প্রদত্ত বিবৃতিতে) একটি পূর্ণাঙ্গ আইপিথন শেলের অ্যাক্সেস পান ।

ম্যাটল্যাবের মতো আইপিথন ডিবাগিং :

এই জাতীয় "বর্ধিত ডিবাগিং" এর একটি উদাহরণ এমএটিএলবিতে পাওয়া যাবে, যেখানে ব্যবহারকারী সর্বদা ম্যাটল্যাব ইঞ্জিন / শেলটিতে সম্পূর্ণ অ্যাক্সেস পেয়ে থাকে এবং তিনি এখনও তার কোডের মাধ্যমে ধাপে ধাপে শর্তসাপেক্ষে ব্রেকপয়েন্টগুলি সংজ্ঞায়িত করতে পারেন From অন্যান্য ব্যবহারকারীর সাথে আমি যা আলোচনা করেছি, এটি ডিবাগিং বৈশিষ্ট্য যা ম্যাটল্যাব থেকে আইপিথনে যাওয়ার সময় লোকেরা সবচেয়ে বেশি মিস করে।

ইম্যাকস এবং অন্যান্য সম্পাদকদের আইপিথন ডিবাগিং:

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


pdb এর !কমান্ড রয়েছে যা
ব্রেকথপয়েন্টে

5
আমি মতলবের অনুরূপ পাইথন ডিবাগারও চাইছি! উদাহরণস্বরূপ, আমি পাইথন শেলটিতে প্রচুর প্রোটোটাইপিং করি। সমস্ত ভেরিয়েবল শেলের সাহায্যে সংরক্ষিত হয়। এখন আমি একটি সমস্যা পূরণ। আমি শেলের সাথে গণনা করা ভেরিয়েবলগুলি সহ একটি ছোট ছোট কোডের ডিবাগ করব hope তবে, একটি নতুন ডিবাগার পুরানো ভেরিয়েবল অ্যাক্সেস করতে পারে না। প্রোটোটাইপিংয়ের জন্য এটি সুবিধাজনক নয়।
ব্যবহারকারী 1914692

1
ইমাক্স ব্যবহারকারীদের জন্য, রিয়েলজিইউডির একটি অবিশ্বাস্যভাবে ভাল ইন্টারফেস রয়েছে।
ক্লাইমেন্ট

1
ধন্যবাদ @ ক্লিমেন্ট আমি গত মাস ধরে রেপো অনুসরণ করে চলেছি এবং প্রকল্পটি সম্পর্কে আমি খুব উচ্ছ্বসিত আছি :) আমি এখনও এটি চেষ্টা করি নি, তবে একবার আমি (বা যদি আপনি করেন) এখানে উত্তর লিখতে নির্দ্বিধায় অনুভব করতে পারি যে সম্ভবত যা অনুরোধ করা হয়েছে তা কীভাবে সম্পাদন করতে হয় তা দেখায়। রেফারেন্সের জন্য অন্যদের জন্য URL টি github.com/rocky/emacs-dbgr
আমেলিও

@ ক্লিটমেন্ট এছাড়াও, আপনার যদি রিয়েলজিইউডি এবং আইপিডিবি নিয়ে কোনও অভিজ্ঞতা থাকে, তবে আমি এখানে github.com/rocky/emacs-dbgr/issues/96 ভাগ্য ছাড়াই বর্ণিত হিসাবে এটি ব্যবহার করার চেষ্টা করেছি ।
আমেলিও ওয়াজকেজ-রেইনা

উত্তর:


61

আপনি আইপিথনের %pdbযাদু ব্যবহার করতে পারেন । কেবল %pdbআইপিথনে কল করুন এবং কোনও ত্রুটি দেখা দিলে আপনি স্বয়ংক্রিয়ভাবে সেখানে নামিয়ে দিন ipdb। আপনার অবিলম্বে পদক্ষেপ না থাকলেও আপনি পরে যাবেন ipdb

এটি পৃথক ফাংশনগুলি ডিবাগিংকে সহজ করে তোলে, কারণ আপনি কেবল একটি ফাইল লোড করতে পারেন %loadএবং তারপরে একটি ফাংশন চালাতে পারেন। আপনি assertসঠিক অবস্থানে একটি দিয়ে একটি ত্রুটি জোর করতে পারে ।

%pdbএকটি লাইন যাদু। যেমন কল %pdb on, %pdb 1, %pdb offবা %pdb 0। যুক্তি ছাড়াই যদি কল করা হয় এটি একটি টগল হিসাবে কাজ করে।


6
^ এই বাস্তব উত্তর
সেজার

প্রাথমিকভাবে আইপিথনে না হয়ে পিডিবিতে আইপিথনের মতো কার্যকারিতা রয়েছে এমন কি কিছু আছে?
লুকাস

4
আপনি প্রোগ্রামটি শুরু করতে পারেন এবং ipython --pdb file.py -- argsব্যতিক্রম বাদে আইপিডিবিতে বাদ পড়তে পারেন। উত্তরে যুক্ত করার মতো হতে পারে।
সেবাস্তিয়ান

110

Ipdb.set_trace () সম্পর্কে কী? আপনার কোডে:

import ipdb; ipdb.set_trace()

আপডেট : পাইথন ৩.7 এ এখন লিখতে পারি breakpoint()। এটি একই কাজ করে তবে এটি PYTHONBREAKPOINTপরিবেশের পরিবর্তনশীলকেও মান্য করে । এই বৈশিষ্ট্যটি এই পিইপি থেকে আসে ।

এটি আপনার কোডের সম্পূর্ণ পরিদর্শন করার অনুমতি দেয় এবং আপনার কাছে c(চালিয়ে যাওয়া), n(পরবর্তী লাইনটি কার্যকর করা), s(বিন্দুতে পদ্ধতিতে পদক্ষেপ) এবং এর মতো কমান্ডের অ্যাক্সেস রয়েছে।

আইপিডিবি রেপো এবং কমান্ডের তালিকা দেখুন । IPython : (অংশ সম্পাদনা) এখন বলা হয় Jupyter


PS: নোট করুন যে একটি আইপিডিবি কমান্ড পাইথন কোডের চেয়ে অগ্রাধিকার নেয়। যাতে লিখতে list(foo)আপনার প্রয়োজন হয় print list(foo)

এছাড়াও, আপনি যদি আইপথন প্রম্পটটি পছন্দ করেন (এর ইম্যাকস এবং ভিম মোডস, ইতিহাস, পরিপূরক, ...) আপনার প্রকল্পের জন্য এটি পাওয়া সহজ তবে এটি পাইথন প্রম্পট টুলকিটের উপর ভিত্তি করে ।


10
এই এটা করতে হয়।
j08lue

আমার উত্তরে এখন ইম্যাকগুলিতে কীভাবে ipdbব্যবহার করা যায় RealGUDএবং isend-modeওপি যা জিজ্ঞাসা করে ঠিক তা করে।
আমেলিও ওয়াজকেজ-রেইনা

1
জুপিটার আইপিথনের প্রতিস্থাপন নয়, আইপিথন নোটবুকের জন্য। জুপিটার নোটবুকগুলি পটভূমিতে কার্নেল ব্যবহার করে। পাইথন নোটবুকের জন্য, কার্নেলটি সাধারণত একটি আইপিথন কার্নেল হয়। IPython প্রকল্পের আরও চলতে থাকে।
এফ

1
breakpoint()ম্ফগ. পাইচার্মে এটি আপনাকে পাইচার্ম ডিবাগারে ফেলে দেয়। কনসোলে আটকানো ফাংশনগুলি থেকে পাইচর্ম ডিবাগারে প্রবেশের দ্রুত উপায়।
রিচার্ড মোহন

40

(28 মে, 2016-এ আপডেট হওয়া) ইম্যাক্সে রিয়েলজিইউডি ব্যবহার করা

ইমাক্সের যে কারও জন্য, এই থ্রেডটি দেখায় যে কীভাবে ওপিতে বর্ণিত সমস্ত কিছু সম্পাদন করতে হয় (এবং আরও অনেক কিছু)

  1. ইমাক্সে নতুন একটি গুরুত্বপূর্ণ ডিবাগার রিয়েলজিইউডি নামে পরিচিত যা কোনও ডিবাগার (সহ ipdb) সহ পরিচালনা করতে পারে ।
  2. 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)নীচের একটি উপায়ে প্রার্থনা করছি :

  1. হয় পাইথন প্রোগ্রাম চালনা করে যা ইউনিক্স শেল থেকে এই ফাংশনটি আহ্বান করে
  2. অথবা সরাসরি আইপিথন থেকে অনুরোধ করে

আমি এটিকে যেভাবেই প্রার্থনা করি না কেন, দোভাষী যে লাইনে বলে তা বন্ধ করে দেয় ipsh()। আপনার কাজ শেষ হয়ে গেলে, আপনি করতে পারেন Ctrl-Dএবং পাইথন পুনরায় প্রয়োগ শুরু করবে (আপনি যে কোনও পরিবর্তনশীল আপডেট দিয়েছিলেন)। উল্লেখ্য যে, যদি আপনি একটি নিয়মিত IPython IPython শেল থেকে কোড (কেস উপরে 2) চালানো, নতুন IPython শেল হবে নেস্টেড এক, যা পুরোপুরি জরিমানা যেখান থেকে আপনি এটা প্রার্থনা ভিতরে, কিন্তু এটা ভালো সচেতন হতে হবে। যেভাবেই, একবার অনুবাদকের অবস্থানের স্থানে থামার পরে ipsh, আমি a(যা হতে 2) এর মানটি পরীক্ষা করতে পারি , কোন ফাংশন এবং অবজেক্টগুলি সংজ্ঞায়িত করা হয়েছে তা দেখুন etc.

সমস্যাটি:

উপরের সমাধানটি আপনার কোডের যে কোনও জায়গায় পাইথনটি থামাতে ব্যবহার করা যেতে পারে এবং তারপরে আপনাকে সম্পূর্ণ আইপিথন ইন্টারপ্রেটারে ফেলে দেয় drop দুর্ভাগ্যক্রমে এটি একবারে আপনি স্ক্রিপ্ট শুরু করলে ব্রেকপয়েন্টগুলি যুক্ত বা সরাতে দেয় না, যা অত্যন্ত হতাশাব্যঞ্জক। আমার মতে, এই একমাত্র জিনিসটি আইপথনকে পাইথনের জন্য একটি দুর্দান্ত ডিবাগিং সরঞ্জাম হয়ে উঠতে বাধা দিচ্ছে ।

আপাতত সেরা আপনি যা করতে পারেন:

ipsh()আপনি যে পাইথন ইন্টারপ্রেটারকে আইপিথন শেল (যেমন ক breakpoint) চালু করতে চান সেখানে বিভিন্ন স্থানে একটি প্রাইরি স্থাপন করা হয় A তারপরে আপনি বিভিন্ন প্রাক-সংজ্ঞায়িত, হার্ড-কোডড "ব্রেকপয়েন্টস" এর সাথে "লাফিয়ে" যেতে পারেন Ctrl-D, যা বর্তমান এম্বেডড আইপিথন শেলটি থেকে প্রস্থান করবে এবং যখনই অনুবাদক পরবর্তী কলটিতে হিট করবে তখন আবার থামবে ipsh()

আপনি যদি এই রুটে যান, "ডিবাগিং মোড" থেকে প্রস্থান এবং পরবর্তী সমস্ত ব্রেকপয়েন্টগুলি উপেক্ষা করার একটি উপায় হ'ল ব্যবহার করা ipshell.dummy_mode = Trueযা পাইথনকে ipshellউপরে তৈরি করা বস্তুর পরবর্তী কোনও তাত্পর্যকে উপেক্ষা করবে ।


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

1
আপনি কোথায় / কীভাবে সিএফজি, ব্যানার_এমএসজি, প্রস্থান_এমএসজি এবং পরিদর্শন করবেন / আমদানি করবেন?
গর্ডন বিন

1
এটি আমার পক্ষে ভাল কাজ করছে বলে মনে হচ্ছে: github.com/kdodia/snippets/blob/master/ipsh.py
karan.dodia

1
import inspectএটি কাজ করার আগে আমার যুক্ত করা দরকার । কমান্ড লাইন কাস্টমাইজেশন যদিও আমার জন্য বিভক্ত বলে মনে হচ্ছে।
পাস্কাল

7
শুধু ব্যবহার করছেন না কেন import ipdb; ipdb.set_trace()? হতে পারে আমি কিছু মিস করছি তবে আমি আপনার আরও জটিল পদ্ধতির সুবিধা দেখতে পাচ্ছি না।
লুয়েটর

19

আপনি পুডব থেকে আইপিথন সেশন শুরু করতে পারেন এবং আপনার পছন্দ অনুযায়ী ডিবাগিং সেশনে ফিরে যেতে পারেন।

বিটিডাব্লু, আইপিডিবি আইপিথনকে পর্দার পিছনে ব্যবহার করছে এবং আপনি আসলে আইপিথন কার্যকারিতা যেমন ট্যাব সমাপ্তি এবং যাদু কমান্ড (যা দিয়ে শুরু হয় %) ব্যবহার করতে পারেন । আপনি আইপিডিবিতে ঠিক থাকলে আপনি আইপিথন থেকে %runএবং যেমন কমান্ড ব্যবহার করে এটি শুরু করতে পারেন %debug। আইপিডিবি সেশনটি স্ট্যাক ট্রেসটিতে আপনি উপরে এবং নীচে যেতে পারেন সেই অর্থে প্লে আইপিথনের চেয়ে অনেক ভাল is "অবজেক্ট ইন্সপেকশন" এর জন্য আইপিডিবিতে কী নেই?

এছাড়াও, পাইথন.ইল Emacs> = 24.3 এর সাথে বান্ডিল রয়েছে চমৎকার আইপিডিবি সমর্থন।


1
ধন্যবাদ tkf। আমি আপনার ইমাসস-জেডি প্যাকেজের বড় ভক্ত। আপনি যখন বলেছিলেন যে ইমাসস 24.3 আইপিডিবি-র জন্য চমৎকার সমর্থন করেছে, আপনি কি বিবরণ দিতে চান? আমি সাধারণত পৃথক M-x ansi-termবাফারে আইপিথন শুরু করি এবং তারপরে আমি আমার সোর্স বাফারগুলিকে আইপিথন বাফারে আবদ্ধ করতে আইসেন্ড-মোড ব্যবহার করি যাতে আমি আইপিথন ইন্টারপ্রেটারকে একটি কীবোর্ড শর্টকাট দিয়ে কোড পাঠাতে পারি যা স্বয়ংক্রিয়ভাবে যাদুটিকে আইপিথন বাফারে প্রেরণ করে %paste। এটি আমাকে আইপিথনে অঞ্চলগুলি দ্রুত পরীক্ষা করার অনুমতি দেয়। আমি সর্বদা এই আইপিথন শেল থেকে আমার প্রোগ্রামগুলি চালিত করি runএবং embed()থামাতে ব্যবহার করি।
অ্যামিলিও ওয়াজকেজ-রেইনা

3
উদাহরণস্বরূপ, আপনি কোডের মাধ্যমে পদক্ষেপ নেওয়ার সময় সোর্স কোডটি অন্য বাফারে তীরের সাথে বর্তমান চলমান পয়েন্টকে নির্দেশ করে খোলা হয়। আপনার কাছে সেন্ড-অঞ্চল কমান্ডও রয়েছে, যেমন আপনি ইসেন্ড-মোডের সাথে করেন।
tkf

ধন্যবাদ @tkf আমি কীভাবে সম্পর্কিত শেলটি ipdbব্যবহার করে একটি ডিবাগিং অধিবেশন শুরু করতে পারি python.elএবং এর মতো জিনিস থাকতে send-regionপারি? সাধারণভাবে, আমি এই বিষয়ে আরও তথ্য কোথায় পাব?
অ্যামিলিও ওয়াজকেজ-রেইনা

আমি ব্যবহার করি %runবা %debug। আমার ধারণা import ipdb; ipdb.set_trace()খুব কাজ করে। আমি মনে করি না আপনি আইপিডিবিতে একাধিক লাইন প্রেরণ করতে পারবেন। এটাই আইপিডিবির সীমাবদ্ধতা। তবে সম্ভবত %pasteকৌশল কাজ করে। আপনি আইপিথন দেবকে একটি বৈশিষ্ট্য অনুরোধ প্রেরণ করতে চাইতে পারেন।
tkf

13

@ গাবরস এর উত্তরটিতে অ্যাপ্রোচটি অবচিত বলে মনে হচ্ছে ।

নতুন পদ্ধতিটি মনে হচ্ছে:

from IPython.core import debugger
debug = debugger.Pdb().set_trace

def buggy_method():
    debug()

এটি কি ipdbডিবাগ করার সময় আইপথন শেলের মধ্যে বিবৃতি ব্যবহারের অনুমতি দেয় ?
alpha_989

6

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

ipdb> help(numpy.transpose)
*** No help on (numpy.transpose)

তবে! সাহায্য (numpy.transpose) আপনাকে numpy.transpose- তে প্রত্যাশিত সহায়তা পৃষ্ঠা দেবে। একইভাবে ভেরিয়েবল নামের জন্য, বলুন আপনার একটি পরিবর্তনশীল l রয়েছে, পিডিবিতে "l" টাইপ করে কোডটি তালিকাভুক্ত করা হয়, তবে! L এর মান মুদ্রণ করে।


2
এটি একটি বাজে পিডিবি গেটচা, এবং সম্পর্কে ভালভাবে জেনে রাখা ভাল।
উইলফ্রেড হিউজ

4

আপনি এই টিপ চেষ্টা করে ?

বা আরও ভাল এখনও, আইপথন ব্যবহার করুন, এবং কল করুন:

from IPython.Debugger import Tracer; debug_here = Tracer()

তাহলে আপনি কেবল ব্যবহার করতে পারেন

debug_here()

আপনি যখনই একটি ব্রেকপয়েন্ট সেট করতে চান


4

আপনি IPython ভিতরে থেকে শুরু করতে পারেন ipdb!

প্রবৃত্ত ipdbডিবাগার 1 :

import idpb; ipdb.set_trace()

IPython লিখুন মধ্যে থেকেipdb>কনসোল 2 :

from IPython import embed; embed()

ফিরুন ipdb>মধ্যে থেকে কনসোল IPython:

exit

আপনি যদি ভাগ্যবান হন যাতে ইমাস ব্যবহার করা যায় তবে জিনিসগুলিকে আরও সুবিধাজনক করা যায়!

এটি ব্যবহার করা প্রয়োজন M-x shell। ব্যবহার yasnippetএবং বিএম , নিম্নলিখিত স্নিপেট সংজ্ঞায়িত করুন। এটি ipdbসম্পাদকের পাঠ্যটি set-traceরেখার সাথে প্রতিস্থাপন করবে । স্নিপেট সন্নিবেশ করার পরে, লাইনটি হাইলাইট করা হবে যাতে এটি সহজে লক্ষণীয় ও নেভিগেশযোগ্য হয়। M-x bm-nextনেভিগেট করতে ব্যবহার করুন ।

# -*- mode: snippet -*-
# name: ipdb
# key: ipdb
# expand-env: ((yas-after-exit-snippet-hook #'bm-toggle))
# --
import ipdb; ipdb.set_trace()

1 সহজে মুছে ফেলার জন্য সমস্ত এক লাইনে। যেহেতু importsকেবল একবারই ঘটে থাকে, এই ফর্মটি নিশ্চিত করে ipdbযে কোনও অতিরিক্ত ওভারহেড ছাড়াই আপনার প্রয়োজন হবে imported

2 আপনি নিজের ফাইলের IPython মধ্যে.pdbrc আমদানি করে কিছু টাইপিং সংরক্ষণ করতে পারেন :

try:
    from IPython import embed
except:
    pass

এটি আপনাকে কেবলমাত্র embed()ভিতরে থেকে কল করতে দেয় ipdb(অবশ্যই আইপিথন ইনস্টল করা হলেই)।


3

একটি বিকল্প হ'ল স্পাইডারের মতো আইডিই ব্যবহার করা যা ডিবাগ করার সময় আপনার কোডের সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয় (আসলে আইপিথন কনসোল ব্যবহার করে)। আসলে, স্পাইডার খুব ম্যাটল্যাব-এর মতো, যা আমি ধারণা করি ইচ্ছাকৃত। এর মধ্যে ভেরিয়েবল ইন্সপেক্টর, ভেরিয়েবল এডিটিং, ডকুমেন্টেশনের অন্তর্নির্মিত অ্যাক্সেস ইত্যাদি অন্তর্ভুক্ত রয়েছে


3

প্রশ্নের সঠিক, সহজ, শীতল, সঠিক উত্তরটি হ'ল -d পতাকা সহ% রান ম্যাক্রো ব্যবহার করা।

In [4]: run -d myscript.py
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.        
> /cygdrive/c/Users/mycodefolder/myscript.py(4)<module>()
      2                                                            
      3                        
----> 4 a=1                                            
      5 b=2

এটি উচ্চতর হওয়া উচিত। আমার কোডে একটি লাইন inোকানোর প্রয়োজন হলে (মডিউলটির মধ্যে) মডিউলটি পুনরায় লোড করার জন্য আইপিথন পুনরায় চালু করতে হবে। এর সাথে আমি %save /tmp/foo.py x-yকেবল কোডটি চালাতে এবং ডিবাগ করতে চাই এবং তারপরে %run -d /tmp/foo.pyযেখানে খুশি ব্রেক ব্রেকপয়েন্ট সেট করতে পারি। দুর্দান্ত উত্তর!
রোমিও ভ্যালেন্টিন

2

যদি আপনি এম্বেড () কনসোলে প্রস্থান () প্রস্থান করেন তবে কোড চালিয়ে যান এবং পরবর্তী এম্বেড () লাইনে যান।


2

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

এটি মনে হচ্ছে যে ধাপে ধাপে (এখনও?) ভাল কাজ করে না (অর্থাত্ একটি লাইনে থামানো এবং তারপরে অন্য ফাংশনে পদক্ষেপ নেওয়া) যদি না আপনি অন্য ব্রেক-পয়েন্ট সেট আপ করেন।

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


2

পাইথন ৩.২ থেকে আপনার কাছে interactকমান্ডটি রয়েছে যা আপনাকে পুরো পাইথন / আইপথন কমান্ড স্পেসে অ্যাক্সেস দেয়।


1

ইমড্যাক্সের আইপিথন-শেল এবং ব্রেকডপয়েন্ট সেট pdb.set_trace () এর মাধ্যমে চলমান কাজ করা উচিত।

পাইথন-মোড.এল, এমএক্স আইপিথন আরইটি ইত্যাদি দিয়ে পরীক্ষা করা হয়েছে


1

নতুন কোড বিকাশ করা হচ্ছে

আইপথনের ভিতরে ডিবাগিং

  1. পরীক্ষার পুনরাবৃত্তির গতি বাড়ানোর জন্য জুপিটার / আইপিথন সেল সম্পাদন ব্যবহার করুন
  2. পদক্ষেপের জন্য %% ডিবাগ ব্যবহার করুন

সেল উদাহরণ:

%%debug
...: for n in range(4):
...:    n>2

ডিবাগিং বিদ্যমান কোড

ডিবাগিংয়ের ভিতরে আইপিথন

  1. একটি ভাঙা ইউনিট পরীক্ষা ডিবাগিং: pytest ... --pdbcls=IPython.terminal.debugger:TerminalPdb --pdb
  2. পরীক্ষা মামলার বাইরে ডিবাগিং: breakpoint(), python -m ipdb, ইত্যাদি
  3. আইপাইথন.ইম্বেড () ডিবাগের সময় যেখানে প্রয়োজন সেখানে পূর্ণ আইপিথন কার্যকারিতার জন্য

পাইথন সম্পর্কে চিন্তাভাবনা

আমি ওপিটির সাথে একমত আছি যে ম্যাটল্যাব পাইথনের এখনও অনেক কিছুই করেনি এবং সত্যই হওয়া উচিত যেহেতু ভাষার প্রায় প্রতিটি কিছুই উত্পাদন গতির চেয়ে বিকাশের গতির পক্ষে। হয়তো কোনও দিন আমি সিপিথনে তুচ্ছ বাগ ফিক্সের চেয়ে বেশি অবদান রাখব।

https://github.com/ipython/ipython/commit/f042f3fea7560afcb518a1940daa46a72fbcfa68

এছাড়াও দেখুন ডিবাগিং দিয়ে আইপিথনে কমান্ড চালানো কি সম্ভব?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.