পাইথনের নিজস্ব ডিবাগার (PDB) এর মধ্যে মাল্টি-লাইন স্টেটমেন্টগুলি কীভাবে কার্যকর করা যায়


157

সুতরাং আমি একটি পাইথন স্ক্রিপ্ট চালাচ্ছি যার মধ্যে আমি পাইথনের ডিবাগার, পিডিবি কল করে বলছি:

import ipdb; ipdb.set_trace()

(আইডিথনের পিডিবি'র সংস্করণ, যদিও আমি মনে করি না যে এটি কোনও পার্থক্য করে; আমি কেবল এটি রঙিন আউটপুট জন্য ব্যবহার করি)।

এখন, আমি যখন ডিবাগারে পৌঁছাম তখন আমি মাল্টি-লাইন স্টেটমেন্ট কার্যকর করতে চাই যেমন একটি if ক্লজ বা লুপের জন্য তবে আমি টাইপ করার সাথে সাথে

if condition:

এবং রিটার্ন কী টিপুন, আমি ত্রুটি বার্তা পেয়েছি *** SyntaxError: invalid syntax (<stdin>, line 1)

কীভাবে একজন পিডিবিতে মাল্টি-লাইন স্টেটমেন্ট কার্যকর করতে পারে? যদি সম্ভব না হয় তবে এখনও যদি একটি ক্লজ বা লুপের জন্য একটি কার্যকর করা যায় তবে তার চারপাশে কোনও উপায় আছে?

উত্তর:


265

আপনি পিডিবিতে থাকাকালীন সমস্ত স্থানীয় ভেরিয়েবলগুলি সহ অস্থায়ী ইন্টারেক্টিভ পাইথন সেশনটি চালু করার জন্য এটি করতে পারেন:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

আপনার হয়ে গেলে, নিয়মিত পিডিবি প্রম্পটে ফিরে আসতে Ctrl-D ব্যবহার করুন।

শুধু Ctrl-C না আঘাত করুন, এটি পুরো পিডিবি সেশনটি শেষ করবে।


46
মনে হয় পিডিবি interactকমান্ড ব্যবহার করে এটি অর্জন করা সম্ভব ( যেমন আমি এই বাগ ট্র্যাকার বার্তাটি শিখেছি )।
জারিত

3
বিবৃতিতে !প্রয়োজনীয়তা কেন import?
ইন্দ্রধনুশ গুপ্ত

19
এটি সম্ভবত প্রয়োজন হয় না, তবে !দুর্ঘটনা এড়াতে আমার পাইথনের সমস্ত বিবৃতি পিডিবিতে উপস্থাপন করার অভ্যাস রয়েছে । উদাহরণস্বরূপ c = 42, পিডিবি- তে ভেরিয়েবলকে বরাদ্দ না দিয়ে কার্যকর করা চালিয়ে যেতে হবে c
মারিউস গেডমিনাস

8
@ মারিয়াসজেডমিনাস পিডিবির সবচেয়ে হতাশার বিষয়! যদি তাদের আদেশগুলি উপসর্গ করা থাকে তবে ভাল হবে ...
ইয়ান ক্লার্ক

দ্রষ্টব্য: Ctrl-D মনে হয় interactখুব প্রস্থান করার সঠিক উপায় , তবে এটি আমার জন্য স্পাইডারের সাথে ভাল খেলছে না।
জোশিয়ার যোদার

69

পাইথন 3 এ ipdb(এবং pdb) একটি ইন্টারেক্টিভ নামক কমান্ড রয়েছে । এটি ব্যবহার করা যেতে পারে:

একটি ইন্টারেক্টিভ ইন্টারপ্রিটার ( কোড মডিউল ব্যবহার করে ) শুরু করুন যার বৈশ্বিক নেমস্পেসে বর্তমান সুযোগে পাওয়া সমস্ত (গ্লোবাল এবং স্থানীয়) নাম রয়েছে।

এটি ব্যবহার করতে, কেবল interactপিডিবি প্রম্পটে প্রবেশ করুন । অন্যান্য জিনিসের মধ্যে এটি একাধিক লাইনের বিস্তৃত কোড প্রয়োগের জন্য এবং অন্যান্য পিডিবি কমান্ডগুলির দুর্ঘটনাজনিত ট্রিগার এড়ানোর জন্যও কার্যকর।


2
এটি করার সময় এটি আমাকে "নেমেরর: নাম 'ইন্টারেক্ট' সংজ্ঞায়িত করা হয় না"।
জেসন

1
@ জেসন সংস্করণ 3.2 বা উচ্চতর
ভাইয়ের-কে

2
যে ব্যাখ্যা। আমি পাইথন ছিল ২.7।
জেসন

সতর্কতার সাথে এটি আসলে একটি ত্রুটি ছুঁড়েছিল যা ইন্টারঅ্যাক্টটিকে সংজ্ঞায়িত করা যায় না এবং প্রক্রিয়াটি থেকে বেরিয়ে যায়
ক্যামেরন_গডবউট

1
আমি মনে করি এড়ানো interactপরামর্শ দেওয়া খুব শক্তিশালী। আমার যা প্রয়োজন কেবল 90% এটি এবং এর চেয়ে টাইপ করা অনেক সহজfrom IPython import embed; embed()
vaer-k

43

আমার প্রস্তাবটি আইপিথন এম্বেডিং ব্যবহার করা।

ipdb> from IPython import embed; embed()

2
যদি আপনার মান থাকে তবে তালিকা বোঝার ক্ষেত্রে ত্রুটি সংজ্ঞায়িত করা হয়নি, আইপিথন থেকে ব্যবহার করার চেষ্টা করুন import embed; embed(user_ns=locals())
fx-kirin

1
এটি আমার পক্ষে গৃহীত উত্তরের চেয়ে অনেক ভাল কাজ করে। উদাহরণস্বরূপ - এটি মাল্টলাইনের যথাযথ সম্পাদনার অনুমতি দেয় - যেমন কয়েকটি লাইন ফিরে যাওয়া এবং কোনও কিছু ঠিক করা, যাতে আপনাকে আপনার সম্পূর্ণ মাল্টি-লাইন এক্সপ্রেশনটি আবার লিখতে হবে না ... আমি স্থানীয়দের @ fx-kirin হিসাবে পাস করছি সুপারিশ করেছে।
ZeDuS

33

পাইথনের (২.7.১) ইন্টারপ্রেটার বা ডিবাগার (ইম্পোর্ট পিডিবি) এর ভিতরে আপনি নীচের বাক্য গঠন সহ একটি মাল্টি-লাইন স্টেটমেন্ট কার্যকর করতে পারেন।

for i in range(5): print("Hello"); print("World"); print(i)

দ্রষ্টব্য: আমি যখন দোভাষীর ভিতরে থাকি তখন কোডটি কার্যকর হওয়ার আগে আমাকে দুবার ফিরে আসতে হবে। ডিবাগারটির অভ্যন্তরে, তবে আমাকে কেবল একবার ফিরতে হবে।


5
এটি এক স্তর থেকে আরও গভীর কিছু চালানোর অনুমতি দেয় না।
অ্যান্টনি হ্যাচকিন্স

7

একটি বিশেষ কেস আছে যদি আপনি চান একটি ব্রেক পয়েন্ট হিট করার সময় কয়েকটি কমান্ড কার্যকর করা হবে। তারপরে ডিবাগার কমান্ড রয়েছে commands। এটি আপনাকে কমান্ডের একাধিক লাইন প্রবেশ করতে এবং তারপরে endমূল শব্দের সাহায্যে পুরো ক্রমটি শেষ করতে দেয় end সাথে আরও (pdb) help commands


2

আপনি এটি করতে পারেন কিনা তা আমি জানি না, যদিও আইপিডিবির পক্ষে এটি দুর্দান্ত বৈশিষ্ট্য হবে। আপনি অবশ্যই তালিকা বোধগম্য ব্যবহার করতে পারেন, এবং সাধারণ মাল্টি-লাইন এক্সপ্রেশনগুলি যেমন:

if y == 3: print y; print y; print y;

আপনি যা প্রয়োজন তা করতে আগে কিছু ফাংশন লিখতে পারেন যা সাধারণত একাধিক লাইন নেয়।


-6

একটি পাঠ্য সম্পাদকে আপনার কোড লিখুন, তারপরে এটি ডিবাগারে পেস্ট করুন:

if True:
    print('a')

এটি একটি নির্বোধ সমাধান, তবে নোংরা দ্রুত এবং কাজ work এটি লিনাক্স টার্মিনালে কাজ করে, তবে আমি নিশ্চিত নই যে এটি উইন্ডোজ কনসোলটিতে কাজ করবে কিনা।


3
সত্যিই, আমি এটি বলব না যে কোনও বাহ্যিক প্রোগ্রামকে কল করা, লেখা, অনুলিপি করা এবং পেস্ট করা দ্রুত , কেবল নোংরা: পি
দ্য ডেটা সায়েন্টিশিয়ান

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