আইপাইথন নোটবুকটি ডিবাগ করার সঠিক উপায় কী?


121

আমি জানি, %debug magicএকটি কক্ষের মধ্যে ডিবাগ করতে পারেন।

তবে একাধিক কোষে আমার ফাংশন কল রয়েছে।

উদাহরণ স্বরূপ,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

আমি যা চেষ্টা করেছি:

  1. আমি %debugসেল -১ এর প্রথম লাইনে সেট করার চেষ্টা করেছি । তবে এটি সেল -২ চালানোর আগেই, তত্ক্ষণাত ডিবাগ মোডে প্রবেশ করে।

  2. আমি %debugকোডের ঠিক আগে লাইনে যুক্ত করার চেষ্টা করেছি return do_some_thing_about(b)। কিন্তু তারপরে কোডটি চিরতরে চলে, কখনও থামে না।

আইপথন নোটবুকের মধ্যে একটি ব্রেক পয়েন্ট নির্ধারণ করার সঠিক উপায় কী?

উত্তর:


72

আইপিডিবি ব্যবহার করুন

এর মাধ্যমে ইনস্টল করুন

pip install ipdb

ব্যবহার:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

লাইন ব্যবহার করে লাইন কার্যকর করতে nএবং কোনও ফাংশন ব্যবহারে পদক্ষেপের জন্য sএবং প্রম্পট ব্যবহার থেকে ডিবাগিং থেকে প্রস্থান করার জন্য c

উপলভ্য কমান্ডগুলির সম্পূর্ণ তালিকার জন্য: https://appletree.or.kr/quick_references_cards/Python/Python%20Debugger%20Cheatsheet.pdf


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

@ রেক্স আমার জন্য এটি কাজ করে। আইপিডিবি কোথায় রেখেছেন? আমদানি আইপিডিবি রাখুন; ipdb.set_trace (); লাইনে ফিরার আগে do_some_ কিছুর_আউট (খ)। তারপরে, দ্বিতীয় সেল থেকে ফান 1 (এ) কল করুন, এটি কাজ করা উচিত। ডিবাগিং প্রম্ট থেকে বেরিয়ে আসার জন্য 'সি' ব্যবহার করুন
তেভিন জোসেফ কেও

@ রেক্স আরও পরিষ্কারতার জন্য উত্তর আপডেট করেছে।
তেভিন জোসেফ কেও

29
এটি আইপথন কনসোলে কাজ করে তবে iPython নোটবুকে নয় (যা প্রশ্নটি জিজ্ঞাসা করেছিল)। আমি যখন import ipdb; ipdb.set_trace()একটি নোটবুকের ঘরে টাইপ করি তখন এটি বলেMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
বিল

1
জুপিটারে নতুন ... মনে হচ্ছে এটি কোড স্নিপেটগুলি উপস্থাপন এবং ভাগ করার জন্য আরও উপযুক্ত ... আমরা কী কার্যকারিতা রাখতে পারি যা আইডিইগুলি (যেমন গ্রহন, আর্স্টুডিও) প্রকৃত ডিবাগিংয়ের মধ্য দিয়ে যায়, ব্রেকপয়েন্টগুলিতে, এক্সপ্রেশনটিতে ঘড়ি যুক্ত করে এবং ভেরিয়েবল ইত্যাদি প্রথমে দেখে মনে হচ্ছে যে এটি ঘটনাটি নয়, কেবল নিশ্চিত হতে চাই .....
Mahesha999

90

আপনি এর ipdbসাথে জুপিটারের অভ্যন্তরে ব্যবহার করতে পারেন :

from IPython.core.debugger import Tracer; Tracer()()

সম্পাদনা করুন : উপরের ফাংশনগুলি আইপিথন 5.1 থেকে অবহেলা করা হয়েছে। এটিই নতুন পদ্ধতি:

from IPython.core.debugger import set_trace

set_trace()যেখানে আপনার ব্রেকপয়েন্টের প্রয়োজন সেখানে যুক্ত করুন । ইনপুট ক্ষেত্রটি উপস্থিত হলে কমান্ডগুলির helpজন্য টাইপ ipdbকরুন।


20
Tracerঅবচয় ছিল। এখন এটি এইভাবে কাজ করে: from IPython.core.debugger import set_traceএবং set_trace()একটি ব্রেকপয়েন্ট পেল। সূত্র: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
আন্তন তারাসেনকো

1
যেখানে প্রয়োজন সেখানে এক লাইন হিসাবে ব্যবহার করতে সক্ষম: from IPython.core.debugger import set_trace;set_trace()
নীআর

15

আপনার রিটার্ন ফাংশন ডিফ ফাংশনের (মূল ফাংশন) লাইনে রয়েছে, আপনাকে অবশ্যই এটিতে একটি ট্যাব দিতে হবে। আর ব্যবহার করুন

%%debug 

পরিবর্তে

%debug 

পুরো সেলটি কেবল লাইন নয় ডিবাগ করতে। আশা করি, সম্ভবত এটি আপনাকে সাহায্য করবে।


12

আপনি এটিকে যে কোনও ঘরে সর্বদা যুক্ত করতে পারেন:

import pdb; pdb.set_trace()

এবং ডিবাগারটি এই লাইনে থামবে। উদাহরণ স্বরূপ:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

আইপিডিবি করা উচিত?
রেকস

1
@ রেক্স অগত্যা নয়। ipdbপাইথন ডিবাগারের রিফেক্টর যা আইপথনের সাথে আরও ঘনিষ্ঠভাবে সংহত। pdbবিল্ট ইন ইন
টু-বিট অ্যালকেমিস্ট

ipdbআইপথন শেলের বাইরেও ব্যবহার করা যেতে পারে এবং ট্যাব সমাপ্তির মতো কিছু সুবিধা সহ আসে।
জানুয়ারী

12

পাইথন ৩.7 এ আপনি ব্রেকপয়েন্ট () ফাংশন ব্যবহার করতে পারেন । শুধু প্রবেশ করুন

breakpoint()

আপনি যেখানেই রানটাইম থামাতে চান এবং সেখান থেকে আপনি একই পিডিবি কমান্ড (r, c, n, ...) ব্যবহার করতে পারেন বা আপনার ভেরিয়েবলগুলি মূল্যায়ন করতে পারেন।


2
এটি যুক্ত করতে, যখন আপনি ব্রেকপয়েন্ট () কল করেন, আপনি পাঠ্য বাক্সে 'সহায়তা' টাইপ করতে পারেন যা কমান্ডের একটি তালিকা পেতে উপস্থিত হয়।
gbeaven

ব্রেকপয়েন্ট () বা পিডিবি
ডেভ লিউ

8

শুধু টাইপ import pdbjupyter নোটবুক, এবং তারপর এটি ব্যবহার cheatsheet ডিবাগ করতে। এটা খুব সুবিধাজনক।

c-> চালিয়ে যান, s-> পদক্ষেপ, b 12-> ব্রেক লাইনটি 12 লাইনে সেট করুন এবং আরও অনেক কিছু।

কিছু দরকারী লিঙ্ক: পিডিবিতে পাইথন অফিশিয়াল ডকুমেন্ট , ডিবাগার কমান্ডগুলি কীভাবে ব্যবহার করবেন তা আরও ভালভাবে বোঝার জন্য পাইথন পিডিবি ডিবাগার উদাহরণ

কিছু দরকারী স্ক্রিনশট: এখানে চিত্র বর্ণনা লিখুনএখানে চিত্র বর্ণনা লিখুন


ভাল উত্তর. তবে আমি মনে করি (আমি বৃহস্পতি নোটবুকে নতুন) ব্রেকআপপয়েন্ট সেট করতে একজনকে% ডিবাগ যুক্ত করা উচিত।
বিজ্ঞাপন ইনফিনিটাম

আমি যা করি সেখানে অনুলিপি pdb.set_trace()সেট করতে চাইলে কপি এবং পেস্ট করা হয়, যেহেতু এটি বৃহস্পতি b line_noনোটবুকে কাজ করছে না এবং পাইথন আইডলিতে ভালভাবে কাজ করে।
ফ্লোরা

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

এছাড়াও, আমি জুপির নোটবুকটিতে লাইন নম্বর দেখানোর একটি উপায় খুঁজে পেয়েছি, নতুন লাইনটি ক্লিক করুন এবং তারপরে l টিপুন। অবশ্যই আপনি নিজের শর্টকাটটিও প্রোগ্রাম করতে পারেন, লিপিগুলি বৃহত্তর নোটবুক ওয়েবসাইটে পাওয়া যায়।
ফ্লোরা

1
জুপিটার নোটবুকের কমান্ডের তালিকা প্রদর্শন করতে আমি সর্বদা "পি" ব্যবহার করি use আমি যখন "লাইনের নম্বরগুলি দেখান" লিখি, কমান্ডটি সেখানে শর্টকাটের পাশে উপস্থিত হবে। আপনি যে কমান্ডটি ব্যবহার করতে চান তা শর্টকাটও শিখতে পারেন।
বিজ্ঞাপন ইনফিনিটাম

8

আপনি ত্রুটি পাওয়ার পরে, পরবর্তী কক্ষে কেবল চালিত হন %debugএবং এটিই।


1
ঐটা অসাধারণ!
কেউ কেউ

যাইহোক, এটি ব্যতিক্রম ঘটতে অপেক্ষা করতে হবে, আমরা কিছু ব্রেক ব্রেকপয়েন্ট সেট করে রানটাইমে পরিবর্তনশীল কি তা পরীক্ষা করতে চাই
লুক আরন

7

%pdbজাদু কমান্ড হিসাবে ভাল ব্যবহার করতে ভাল। শুধু বল%pdb on এবং পরবর্তী সময়ে pdbডিবাগারটি সমস্ত ব্যাতিক্রমে চালিত হবে, কল স্ট্যাকের যত গভীর হোক না কেন। খুব সহজ।

আপনার যদি কোনও নির্দিষ্ট লাইন থাকে যা আপনি ডিবাগ করতে চান তবে কেবল সেখানে একটি ব্যতিক্রম উত্থাপন করুন (প্রায়শই আপনি ইতিমধ্যে ইতিমধ্যে আছেন!) বা %debugঅন্যান্য লোকেরা যে যাদু আদেশটি পরামর্শ দিচ্ছে তা ব্যবহার করুন।


5

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

এখানে চিত্র বর্ণনা লিখুন

এটিতে একটি "মূল্যায়ন" ট্যাবও রয়েছে


0

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

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

এটি অন্যান্য আইডিই থেকে সুপরিচিত একটি ভিজ্যুয়াল ডিবাগিং অভিজ্ঞতা সক্ষম করে।

এখানে চিত্র বর্ণনা লিখুন

উত্স: জুপিটারের জন্য একটি ভিজ্যুয়াল ডিবাগার


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