পাইথন ডিবাগিং টিপস [বন্ধ]


164

পাইথন ডিবাগ করার জন্য আপনার সেরা টিপস কি?

এটি আসলে কী করতে পারে তা না বলে দয়া করে কোনও নির্দিষ্ট ডিবাগারকে তালিকাভুক্ত করবেন না।

সম্পর্কিত


উত্তর:


139

পিডিবি

আপনি পিডিবি মডিউলটি ব্যবহার করতে পারেন, pdb.set_trace()যে কোনও জায়গায় sertোকান এবং এটি একটি ব্রেকপয়েন্ট হিসাবে কাজ করবে।

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

মৃত্যুদন্ড কার্যকর করতে ব্যবহার করতে c( contবা continue)।

পিডিবি ব্যবহার করে নির্বিচারে পাইথন এক্সপ্রেশন কার্যকর করা সম্ভব। উদাহরণস্বরূপ, আপনি যদি কোনও ভুল খুঁজে পান, আপনি কোডটি সংশোধন করতে পারেন, তবে চলমান কোডে একই প্রভাব পেতে টাইপ করুন এক্সপ্রেশন

ipdb জন্য পিডিবি একটি সংস্করণ IPython । এটি ট্যাব সমাপ্তি সহ সমস্ত আইপিথন বৈশিষ্ট্য সহ পিডিবি ব্যবহারের অনুমতি দেয়।

অনাবৃত ব্যতিক্রম থেকে স্বয়ংক্রিয়ভাবে চালনার জন্য পিডিবি সেট করাও সম্ভব ।

পিডিব পিডিবি-র উন্নত সংস্করণ হিসাবে লেখা হয়েছিল। উপকারিতা?


এখানে পিডিবি
Sontek

ব্যক্তিগতভাবে, আমি আইপিডিবি আরও ভাল পছন্দ করি
সারদাথ্রিয়ন - এসই অপব্যবহারের বিরুদ্ধে

1
স্পষ্টতই পিডিবির একটি পুনর্লিখন আছে পাইডবিজিআর
এহতেশ চৌধুরী

কোডটিতে পাইথন ব্রেকপয়েন্টগুলি যুক্ত করার জন্য সাবলাইমেক্সটকে একটি দুর্দান্ত প্লাগইন রয়েছে: sublime.wbond.net/packages/Python%20BreakpPoint
ডেনিস গোলোমাজভ

আপনি যদি কোনও ওয়েব অ্যাপ্লিকেশন বিকাশ করছেন তবে myserver.com/pdbডিবাগ মোডের জন্য এমন একটি ভিউ যুক্ত করুন যা কেবল এটি করে import pdb; pdb.set_trace()। আপনি যদি ফ্লাস্ক / ওয়ার্কজিগ ব্যবহার করছেন যা ইন্টারেক্টিভ ডিবাগার রয়েছে, আপনিও দেখতে পারেন যা ঠিক করে assert False
oca

78

http://pypi.python.org/pypi/pudb , একটি পূর্ণ-স্ক্রিন, কনসোল ভিত্তিক পাইথন ডিবাগার।

এর লক্ষ্যটি হ'ল আরও হালকা ও কীবোর্ড-বান্ধব প্যাকেজে আধুনিক জিইউআই ভিত্তিক ডিবাগারগুলির সমস্ত দুর্দান্ত বৈশিষ্ট্য সরবরাহ করা। টার্মিনালে - PuDB আপনাকে ঠিক যেখানে ডাবল কোডটি পরীক্ষা করতে এবং এটি পরীক্ষা করার অনুমতি দেয়। আপনি যদি দুর্দান্ত (তবে আজকাল প্রাচীন) ডস-ভিত্তিক টার্বো পাস্কেল বা সি সরঞ্জামগুলির সাথে কাজ করে থাকেন তবে পিডিবি'র ইউআই পরিচিত হতে পারে।

পুডব স্ক্রিনশট

স্বতন্ত্র স্ক্রিপ্টগুলি ডিবাগ করার জন্য দুর্দান্ত, কেবল চালান

python -m pudb.run my-script.py

সঙ্গে ইনস্টল করুনpip install pudb
congusbongus

40

আপনি যদি পিডিবি ব্যবহার করেন, আপনি শর্টকাটের জন্য উপকরণগুলি সংজ্ঞায়িত করতে পারেন। আমি এগুলি ব্যবহার করি:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

আপনি এই উপনামটি কীভাবে সংজ্ঞায়িত করবেন?
কেসব্যাশ

9
এই স্টাফটি ~ / .pdbrc
নেড ব্যাচেল্ডার

উইন্ডোজগুলিতে আপনি এটিকে ~ / _ipython / ipythonrc.ini
ফাস্টমুটিপ্লিকেশন

33

লগিং

পাইথনের ইতিমধ্যে একটি দুর্দান্ত বিল্ট-ইন লগিং মডিউল রয়েছে । আপনি এখানে লগিং টেম্পলেট ব্যবহার করতে চাইতে পারেন ।

লগিং মডিউল আপনাকে গুরুত্বের একটি স্তর নির্দিষ্ট করতে দেয়; ডিবাগিংয়ের সময় আপনি সমস্ত কিছু লগ করতে পারেন, সাধারণ ক্রিয়াকলাপের সময় আপনি কেবল সমালোচনামূলক জিনিসগুলি লগ করতে পারেন। আপনি জিনিসগুলি চালু এবং চালু করতে পারেন।

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

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

সম্পাদনা: টেমপ্লেটগুলির জন্য মূল URL টি ছিল: http://aymanh.com/python-debugging-techniques

এই পৃষ্ঠাটি অনুপস্থিত তাই আর্কাইভ.আরজে সংরক্ষিত স্ন্যাপশটের একটি রেফারেন্স সহ আমি এটি প্রতিস্থাপন করেছি: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

যদি এটি আবার অদৃশ্য হয়ে যায়, আমি এখানে উল্লিখিত টেম্পলেটগুলি দিচ্ছি। এটি ব্লগ থেকে নেওয়া কোড; আমি এটা লিখিনি।

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

এবং উপরেরটি কীভাবে ব্যবহার করবেন সে সম্পর্কে তার ব্যাখ্যা এখানে। আবার, আমি এর জন্য কৃতিত্ব পাই না:


ডিফল্টরূপে, লগিং মডিউলটি গুরুত্বপূর্ণ, ত্রুটি এবং সতর্কতা বার্তাগুলি মুদ্রণ করে। এটি পরিবর্তন করতে যাতে সমস্ত স্তর মুদ্রিত হয়, ব্যবহার করুন:

$ ./your-program.py --logging=debug

ডিবাগ.লগ নামে একটি ফাইলে লগ বার্তা প্রেরণ করতে, ব্যবহার করুন:

$ ./your-program.py --logging-level=debug --logging-file=debug.log


1
লগিং মডিউলটিতে সমস্যাটি হ'ল এটি ইউনিকোডের সাথে প্রচুর পরিমাণে বিরতি দেয় এবং এটি আন্তর্জাতিকীকরণ অ্যাপ্লিকেশনগুলির মধ্যে কাজ করার জন্য বিভিন্ন কাজের প্রয়োজন হয়। যদিও এটি পাইথনের পক্ষে এখনও সেরা লগিং সমাধান।
Jacek Konieczny

"এখানে লগিং টেম্পলেট" লিঙ্কটি মারা গেছে। আপডেট করুন.
Yohann

20

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

কোড.interact আপনাকে একটি ইন্টারেক্টিভ কনসোলে নিয়ে যায়

import code; code.interact(local=locals())

আপনি যদি সহজেই আপনার কনসোলের ইতিহাসটি অ্যাক্সেস করতে সক্ষম হন তবে এটি দেখুন: " শেলের মতো আমার কি কোনও ইতিহাসের ব্যবস্থা থাকতে পারে ? " (এটি সন্ধান করতে হবে)।

দোভাষী জন্য স্বয়ংক্রিয় সম্পূর্ণ সক্ষম করা যেতে পারে ।



17

print বিবৃতি

  • কিছু লোক debug_printসহজেই অক্ষম করার জন্য মুদ্রণের পরিবর্তে কোনও ক্রিয়াকলাপের প্রস্তাব দেয়
  • pprintমডিউল জটিল কাঠামোর জন্য অমূল্য

3
+1 যখন প্রতিটি ডিবাগার ব্যর্থ হয়, মুদ্রণটি আপনার বন্ধু, হ্যাঁ ডিবাগ_প্রিন্টটি দুর্দান্ত সংযোজন হবে
অনুরাগ ইউনিিয়াল

আমি সাধারণত প্রথমে দ্বিতীয়টি ডিবাগ প্রিন্ট করি তবে যখন আমি জানি যে আমি কোনও বিশেষ বিভাগটি সনাক্ত করে সমাধান করতে সক্ষম
হব

4
আসলে লগ মডিউলটি ঠিক তাই করে।

সত্য, তবে লগিং সেট আপ করতে হবে। আমি অনার্সের পরে মডিউলটি কীভাবে ব্যবহার করব তা শিখব
কেসব্যাশ

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

16

একটি স্ক্রিপ্ট ডিবাগ করার সুস্পষ্ট উপায়

python -m pdb script.py
  • দরকারী যখন সেই স্ক্রিপ্ট একটি ব্যতিক্রম উত্থাপন করে
  • ভ্যাচুয়ালেনভ এবং পিডিবি কমান্ড ভেনভেস পাইথন সংস্করণ সহ চলমান না হলে দরকারী।

আপনি যদি ঠিক বুঝতে না পারেন যে স্ক্রিপ্টটি কোথায়

python -m pdb ``which <python-script-name>``

15

PyDev

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

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


এটিতে সম্পাদনা করার এবং চালিয়ে যাওয়ার ক্ষমতা আছে?
কেসব্যাশ

@ ক্যাসব্যাশ এটি নয় তবে বৈশিষ্ট্যটি পরিকল্পনা করা হয়েছে। এমনকি এটি ছাড়াও, ব্রেকপয়েন্টগুলি নির্ধারণ /
আনসেট করার


12

Winpdb খুব সুন্দর, এবং এর নামের বিপরীতে এটি সম্পূর্ণ ক্রস প্ল্যাটফর্ম।

এটি একটি দুর্দান্ত প্রম্পট ভিত্তিক এবং জিইউআই ডিবাগার পেয়েছে এবং দূরবর্তী ডিবাগিং সমর্থন করে।


@ ক্যাসাব্যাশ - আরও বিশদ যুক্ত করেছে
অরিপ

1
+1 এটি এখন পর্যন্ত আমি একমাত্র পাইথন ডিবাগারটি পেয়েছি যা বহু-থ্রেডিং পরিচালনা করতে পারে।
লি নেদারটন

মাল্টি-থ্রেডিংয়ের "হ্যান্ডলিং" এর সাথে সতর্ক থাকুন - কোনও থ্রেডে কোনও ব্যতিক্রম পুরো প্রক্রিয়াটিকে হিমশীতল করে তোলে। আপনি যদি এটি সম্পর্কে সচেতন হন তবে কোনও খারাপ জিনিস নয়, যদি আপনি না হন তবে খুব বেদনাদায়ক
ওয়াল্ট ডব্লু

প্রকল্পের এপ্রিল 2014 হিসাবে মৃত দেখায়
Alojz Janez

7

ভিমে, আমার এই তিনটি বাঁধাই রয়েছে:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2একটি রিমোট পাইথন ডিবাগার, যা উইনপিডিবি, একটি শক্ত গ্রাফিকাল ডিবাগার সহ ব্যবহার করা যেতে পারে। কারণ আমি জানি যে আপনি জিজ্ঞাসা করবেন, এটি গ্রাফিকাল ডিবাগারের প্রত্যাশা করা সমস্ত কিছু করতে পারে :)

আমি ব্যবহার pdbথেকে nose.toolsযাতে আমি ইউনিট পরীক্ষা সেইসাথে স্বাভাবিক কোড ডিবাগ করতে পারেন।

পরিশেষে, F7ম্যাপিংটি একটি ট্রেসব্যাক মুদ্রণ করবে (স্ট্যাকের শীর্ষে কোনও ব্যতিক্রম বুদবুদ দেওয়ার সময় আপনি যা পান ঠিক তেমনই)। আমি এটি কয়েকবারের চেয়ে সত্যই দরকারী বলে মনে করেছি।


4

আপনার ক্লাসের জন্য দরকারী পুনর্নির্মাণ () পদ্ধতিগুলি সংজ্ঞায়িত করা (যাতে আপনি কোনও বস্তুটি কী তা দেখতে পারেন) এবং repr () বা "% r"% (...) বা "... {0! R} .." বিন্যাস ব্যবহার করে format (...) আপনার ডিবাগ বার্তাগুলি / লগগুলিতে আইএমএইচও দক্ষ ডিবাগিংয়ের মূল চাবিকাঠি।

এছাড়াও, অন্যান্য উত্তরে উল্লিখিত ডিবাগারগুলি পুনরায় () পদ্ধতিগুলি ব্যবহার করবে ।


2

একটি চলমান পাইথন অ্যাপ্লিকেশন থেকে স্ট্যাক ট্রেস প্রাপ্ত

এখানে বেশ কয়েকটি কৌশল রয়েছে । এর মধ্যে রয়েছে

  • একটি সংকেত প্রেরণ করে একটি দোভাষী মধ্যে ব্রেক / স্ট্যাক ট্রেস মুদ্রণ
  • অপ্রস্তুত পাইথন প্রক্রিয়া থেকে স্ট্যাকের ট্রেস পাওয়া
  • এটি ডিবাগিংয়ের জন্য দরকারী করতে পতাকা নিয়ে দোভাষী চালানো

2

আপনি যদি ডিবাগারগুলিতে সময় ব্যয় করতে পছন্দ করেন না (এবং pdbকমান্ড লাইন ইন্টারফেসের দুর্বল ব্যবহারের প্রশংসা করেন না ), আপনি এক্সিকিউশন ট্রেসটি ফেলে দিতে পারেন এবং এটি পরে বিশ্লেষণ করতে পারেন। উদাহরণ স্বরূপ:

python -m trace -t setup.py install > execution.log

এটি setup.py installকার্যকর করার সমস্ত উত্স রেখাকে ডাম্প করবে execution.log

ট্রেস আউটপুট কাস্টমাইজ করা এবং আপনার নিজের ট্রেসারগুলি লেখার পক্ষে আরও সহজ করার জন্য, আমি কোডের কিছু টুকরো একসাথে xtrace মডিউলে (পাবলিক ডোমেন) রেখেছি


1

সম্ভব হলে আমি M-x pdbউত্স স্তরের ডিবাগিংয়ের জন্য ইম্যাকগুলিতে ডিবাগ করি।


1

ডিডবগিং সম্পর্কে টিপসযুক্ত অ্যান্ড্রিয়াস জেলারের উদ্যাতি অন্ড্রিয়াস জেলারের একটি "অনলাইন সফটওয়্যার ডিবাগিং " নামে একটি সম্পূর্ণ অনলাইন কোর্স রয়েছে :

কোর্স সংক্ষিপ্তসার

এই শ্রেণিতে আপনি শিখবেন কীভাবে প্রোগ্রামগুলি নিয়মিতভাবে ডিবাগ করা যায়, কীভাবে ডিবাগিং প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে করা যায় এবং পাইথনে কয়েকটি স্বয়ংক্রিয় ডিবাগিং সরঞ্জাম তৈরি করা যায়।

কেন এই কোর্সটি নিবেন?

এই কোর্সের শেষে আপনার সিস্টেমেটিক ডিবাগিং সম্পর্কে দৃ solid় ধারণা হবে, কীভাবে ডিবাগিং স্বয়ংক্রিয় করতে হবে তা জানতে পারবেন এবং পাইথনে বেশ কয়েকটি কার্যকরী ডিবাগিং সরঞ্জাম তৈরি করেছেন।

পূর্বশর্ত এবং প্রয়োজনীয়তা

উদাসিটি সিএস 101 বা আরও উন্নত পর্যায়ে প্রোগ্রামিং এবং পাইথনের প্রাথমিক জ্ঞান প্রয়োজন। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের প্রাথমিক বোঝাপড়া সহায়ক।

অত্যন্ত বাঞ্ছনীয়.


0

আপনি যদি পঠনযোগ্য ফ্যাশনে আপনার কল স্ট্যাকটি প্রিন্ট করার জন্য কোনও দুর্দান্ত গ্রাফিকাল উপায় চান তবে এই ইউটিলিটিটি দেখুন: https://github.com/joerick/pyinstrument

কমান্ড লাইন থেকে চালান:

python -m pyinstrument myscript.py [args...]

মডিউল হিসাবে চালান:

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

জাঙ্গো দিয়ে চালান:

কেবল যুক্ত pyinstrument.middleware.ProfilerMiddlewareকরুন MIDDLEWARE_CLASSES, তারপরে ?profileপ্রোফাইল সক্রিয় করার জন্য অনুরোধ URL এর শেষে যুক্ত করুন ।

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