পাইথন ডিবাগ করার জন্য আপনার সেরা টিপস কি?
এটি আসলে কী করতে পারে তা না বলে দয়া করে কোনও নির্দিষ্ট ডিবাগারকে তালিকাভুক্ত করবেন না।
সম্পর্কিত
- আমার পাইথন কোডটি প্রথমবার রান করার ভাল উপায়গুলি কী কী? - এটি ত্রুটিগুলি হ্রাস করার বিষয়ে আলোচনা করে
পাইথন ডিবাগ করার জন্য আপনার সেরা টিপস কি?
এটি আসলে কী করতে পারে তা না বলে দয়া করে কোনও নির্দিষ্ট ডিবাগারকে তালিকাভুক্ত করবেন না।
উত্তর:
আপনি পিডিবি মডিউলটি ব্যবহার করতে পারেন, 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 । এটি ট্যাব সমাপ্তি সহ সমস্ত আইপিথন বৈশিষ্ট্য সহ পিডিবি ব্যবহারের অনুমতি দেয়।
অনাবৃত ব্যতিক্রম থেকে স্বয়ংক্রিয়ভাবে চালনার জন্য পিডিবি সেট করাও সম্ভব ।
পিডিব পিডিবি-র উন্নত সংস্করণ হিসাবে লেখা হয়েছিল। উপকারিতা?
myserver.com/pdb
ডিবাগ মোডের জন্য এমন একটি ভিউ যুক্ত করুন যা কেবল এটি করে import pdb; pdb.set_trace()
। আপনি যদি ফ্লাস্ক / ওয়ার্কজিগ ব্যবহার করছেন যা ইন্টারেক্টিভ ডিবাগার রয়েছে, আপনিও দেখতে পারেন যা ঠিক করে assert False
।
http://pypi.python.org/pypi/pudb , একটি পূর্ণ-স্ক্রিন, কনসোল ভিত্তিক পাইথন ডিবাগার।
এর লক্ষ্যটি হ'ল আরও হালকা ও কীবোর্ড-বান্ধব প্যাকেজে আধুনিক জিইউআই ভিত্তিক ডিবাগারগুলির সমস্ত দুর্দান্ত বৈশিষ্ট্য সরবরাহ করা। টার্মিনালে - PuDB আপনাকে ঠিক যেখানে ডাবল কোডটি পরীক্ষা করতে এবং এটি পরীক্ষা করার অনুমতি দেয়। আপনি যদি দুর্দান্ত (তবে আজকাল প্রাচীন) ডস-ভিত্তিক টার্বো পাস্কেল বা সি সরঞ্জামগুলির সাথে কাজ করে থাকেন তবে পিডিবি'র ইউআই পরিচিত হতে পারে।
স্বতন্ত্র স্ক্রিপ্টগুলি ডিবাগ করার জন্য দুর্দান্ত, কেবল চালান
python -m pudb.run my-script.py
pip install pudb
আপনি যদি পিডিবি ব্যবহার করেন, আপনি শর্টকাটের জন্য উপকরণগুলি সংজ্ঞায়িত করতে পারেন। আমি এগুলি ব্যবহার করি:
# 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
লগিং
পাইথনের ইতিমধ্যে একটি দুর্দান্ত বিল্ট-ইন লগিং মডিউল রয়েছে । আপনি এখানে লগিং টেম্পলেট ব্যবহার করতে চাইতে পারেন ।
লগিং মডিউল আপনাকে গুরুত্বের একটি স্তর নির্দিষ্ট করতে দেয়; ডিবাগিংয়ের সময় আপনি সমস্ত কিছু লগ করতে পারেন, সাধারণ ক্রিয়াকলাপের সময় আপনি কেবল সমালোচনামূলক জিনিসগুলি লগ করতে পারেন। আপনি জিনিসগুলি চালু এবং চালু করতে পারেন।
বেশিরভাগ লোকেরা ডিবাগ করার জন্য কেবল প্রাথমিক মুদ্রণ বিবৃতি ব্যবহার করে এবং তারপরে মুদ্রণ বিবৃতিগুলি সরিয়ে দেয়। এগুলিকে ছেড়ে দেওয়া ভাল, তবে তাদের অক্ষম করুন; তারপরে, আপনার যখন অন্য কোনও ত্রুটি রয়েছে তখন আপনি কেবল সবকিছু পুনরায় সক্ষম করতে এবং আপনার লগগুলি সন্ধান করতে পারেন।
প্রোগ্রামগুলি ডিবাগ করার সর্বোত্তম সম্ভাব্য উপায় হতে পারে যেগুলিকে দ্রুত কাজগুলি করা দরকার, যেমন নেটওয়ার্কিং প্রোগ্রামগুলি যা নেটওয়ার্ক সংযোগের অন্য প্রান্তের আগে শেষ হয়ে যায় এবং চলে যায় তার আগে প্রতিক্রিয়া জানাতে হবে। কোনও ডিবাগারকে এক-পদক্ষেপ নেওয়ার জন্য আপনার বেশি সময় নাও থাকতে পারে; তবে আপনি কেবল আপনার কোডটি চালাতে দিতে এবং সমস্ত কিছু লগ করতে পারেন, তারপরে লগগুলিতে ছিদ্র করুন এবং কী ঘটছে তা নির্ধারণ করুন।
সম্পাদনা: টেমপ্লেটগুলির জন্য মূল 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
পাইথন লাইনগুলি কার্যকর করা হয় তা মুদ্রণ করা সম্ভব (ধন্যবাদ জিও!) এটিতে বেশ কয়েকটি অ্যাপ্লিকেশন রয়েছে, উদাহরণস্বরূপ, নির্দিষ্ট ফাংশনগুলি কখন ডাকা হয় তা যাচাই বা ## এর মতো কিছু যুক্ত করার জন্য আপনি এটি পরিবর্তন করতে পারেন যা কেবলমাত্র নির্দিষ্ট রেখাগুলিকেই ট্র্যাক করে।
কোড.interact আপনাকে একটি ইন্টারেক্টিভ কনসোলে নিয়ে যায়
import code; code.interact(local=locals())
আপনি যদি সহজেই আপনার কনসোলের ইতিহাসটি অ্যাক্সেস করতে সক্ষম হন তবে এটি দেখুন: " শেলের মতো আমার কি কোনও ইতিহাসের ব্যবস্থা থাকতে পারে ? " (এটি সন্ধান করতে হবে)।
দোভাষী জন্য স্বয়ংক্রিয় সম্পূর্ণ সক্ষম করা যেতে পারে ।
আইপিডিবি পিডিবির মতো, আইপথনের দুর্দান্ততার সাথে of
print
বিবৃতি
debug_print
সহজেই অক্ষম করার জন্য মুদ্রণের পরিবর্তে কোনও ক্রিয়াকলাপের প্রস্তাব দেয়pprint
মডিউল জটিল কাঠামোর জন্য অমূল্যএকটি স্ক্রিপ্ট ডিবাগ করার সুস্পষ্ট উপায়
python -m pdb script.py
আপনি যদি ঠিক বুঝতে না পারেন যে স্ক্রিপ্টটি কোথায়
python -m pdb ``which <python-script-name>``
PyDev
পাইডেভের একটি খুব ভাল ইন্টারেক্টিভ ডিবাগার রয়েছে। এটিতে ঘড়ি এক্সপ্রেশন, হোভার-টু-মূল্যায়ন, থ্রেড এবং স্ট্যাকের তালিকা এবং (প্রায়) সমস্ত আধুনিক সুযোগ-সুবিধাগুলি আপনি আধুনিক ভিজ্যুয়াল ডিবাগার থেকে আশা করেন। এমনকি আপনি একটি চলমান প্রক্রিয়াতে সংযুক্ত করে রিমোট ডিবাগিংও করতে পারেন।
অন্যান্য ভিজ্যুয়াল ডিবাগারগুলির মতো, যদিও আমি এটিকে বেশিরভাগ সহজ সমস্যাগুলির জন্য, বা অন্য সব চেষ্টা করার পরে খুব জটিল সমস্যার জন্য দরকারী বলে মনে করি। আমি এখনও ভারী ভারী উত্তোলন লগিং দিয়েই করি do
আপনি যদি ভিজ্যুয়াল স্টুডিওর সাথে পরিচিত হন তবে ভিজুয়াল স্টুডিওর জন্য পাইথন সরঞ্জামগুলি আপনি যা সন্ধান করেন তা।
Winpdb খুব সুন্দর, এবং এর নামের বিপরীতে এটি সম্পূর্ণ ক্রস প্ল্যাটফর্ম।
এটি একটি দুর্দান্ত প্রম্পট ভিত্তিক এবং জিইউআই ডিবাগার পেয়েছে এবং দূরবর্তী ডিবাগিং সমর্থন করে।
ভিমে, আমার এই তিনটি বাঁধাই রয়েছে:
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
ম্যাপিংটি একটি ট্রেসব্যাক মুদ্রণ করবে (স্ট্যাকের শীর্ষে কোনও ব্যতিক্রম বুদবুদ দেওয়ার সময় আপনি যা পান ঠিক তেমনই)। আমি এটি কয়েকবারের চেয়ে সত্যই দরকারী বলে মনে করেছি।
আপনার ক্লাসের জন্য দরকারী পুনর্নির্মাণ () পদ্ধতিগুলি সংজ্ঞায়িত করা (যাতে আপনি কোনও বস্তুটি কী তা দেখতে পারেন) এবং repr () বা "% r"% (...) বা "... {0! R} .." বিন্যাস ব্যবহার করে format (...) আপনার ডিবাগ বার্তাগুলি / লগগুলিতে আইএমএইচও দক্ষ ডিবাগিংয়ের মূল চাবিকাঠি।
এছাড়াও, অন্যান্য উত্তরে উল্লিখিত ডিবাগারগুলি পুনরায় () পদ্ধতিগুলি ব্যবহার করবে ।
একটি চলমান পাইথন অ্যাপ্লিকেশন থেকে স্ট্যাক ট্রেস প্রাপ্ত
এখানে বেশ কয়েকটি কৌশল রয়েছে । এর মধ্যে রয়েছে
আপনি যদি ডিবাগারগুলিতে সময় ব্যয় করতে পছন্দ করেন না (এবং pdb
কমান্ড লাইন ইন্টারফেসের দুর্বল ব্যবহারের প্রশংসা করেন না ), আপনি এক্সিকিউশন ট্রেসটি ফেলে দিতে পারেন এবং এটি পরে বিশ্লেষণ করতে পারেন। উদাহরণ স্বরূপ:
python -m trace -t setup.py install > execution.log
এটি setup.py install
কার্যকর করার সমস্ত উত্স রেখাকে ডাম্প করবে execution.log
।
ট্রেস আউটপুট কাস্টমাইজ করা এবং আপনার নিজের ট্রেসারগুলি লেখার পক্ষে আরও সহজ করার জন্য, আমি কোডের কিছু টুকরো একসাথে xtrace মডিউলে (পাবলিক ডোমেন) রেখেছি ।
ডিডবগিং সম্পর্কে টিপসযুক্ত অ্যান্ড্রিয়াস জেলারের উদ্যাতি অন্ড্রিয়াস জেলারের একটি "অনলাইন সফটওয়্যার ডিবাগিং " নামে একটি সম্পূর্ণ অনলাইন কোর্স রয়েছে :
কোর্স সংক্ষিপ্তসার
এই শ্রেণিতে আপনি শিখবেন কীভাবে প্রোগ্রামগুলি নিয়মিতভাবে ডিবাগ করা যায়, কীভাবে ডিবাগিং প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে করা যায় এবং পাইথনে কয়েকটি স্বয়ংক্রিয় ডিবাগিং সরঞ্জাম তৈরি করা যায়।
কেন এই কোর্সটি নিবেন?
এই কোর্সের শেষে আপনার সিস্টেমেটিক ডিবাগিং সম্পর্কে দৃ solid় ধারণা হবে, কীভাবে ডিবাগিং স্বয়ংক্রিয় করতে হবে তা জানতে পারবেন এবং পাইথনে বেশ কয়েকটি কার্যকরী ডিবাগিং সরঞ্জাম তৈরি করেছেন।
পূর্বশর্ত এবং প্রয়োজনীয়তা
উদাসিটি সিএস 101 বা আরও উন্নত পর্যায়ে প্রোগ্রামিং এবং পাইথনের প্রাথমিক জ্ঞান প্রয়োজন। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের প্রাথমিক বোঝাপড়া সহায়ক।
অত্যন্ত বাঞ্ছনীয়.
আপনি যদি পঠনযোগ্য ফ্যাশনে আপনার কল স্ট্যাকটি প্রিন্ট করার জন্য কোনও দুর্দান্ত গ্রাফিকাল উপায় চান তবে এই ইউটিলিটিটি দেখুন: 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 এর শেষে যুক্ত করুন ।