পাইথন কোডে একটি পদ্ধতি থেকে বর্তমান কল স্ট্যাক মুদ্রণ করুন


276

পাইথনে, আমি কীভাবে কোনও পদ্ধতির মধ্যে থেকে বর্তমান কল স্ট্যাকটি মুদ্রণ করতে পারি (ডিবাগিংয়ের উদ্দেশ্যে)।

উত্তর:


319

ট্রেসব্যাক মডিউলটির মাধ্যমে স্ট্যাকটি পাওয়ার এবং এটি মুদ্রণের উদাহরণ এখানে রয়েছে :

import traceback

def f():
    g()

def g():
    for line in traceback.format_stack():
        print(line.strip())

f()

# Prints:
# File "so-stack.py", line 10, in <module>
#     f()
# File "so-stack.py", line 4, in f
#     g()
# File "so-stack.py", line 7, in g
#     for line in traceback.format_stack():

আপনি যদি কেবল স্টারডারে স্ট্যাকটি মুদ্রণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

traceback.print_stack()

অথবা স্টডআউটে মুদ্রণ করতে (পুনঃনির্দেশিত আউটপুট একসাথে রাখতে চাইলে দরকারী), ব্যবহার করুন:

traceback.print_stack(file=sys.stdout)

তবে এটির মাধ্যমে এটি traceback.format_stack()আপনাকে যা খুশি তা করতে দেয়।


অন্যান্য সমস্ত থ্রেডের জন্য কীভাবে করব (আমি নিয়ন্ত্রণ করি না এমন থ্রেডগুলির বিষয়ে বলছি)  ?
ব্যবহারকারী 2284570

হতে পারে আমি এখানে কিছু মিস করছি, তবে আপনি চ কল করুন যার একমাত্র উদ্দেশ্য এখানে জি কল করা এবং অন্য কিছু না করে does কেন
ক্রিস

6
@ ক্রিস: এটি একটি উদাহরণ মাত্র। এটি পরিষ্কার করার জন্য এটির একাধিক ফাংশন রয়েছে যে ফর্ম্যাট_স্ট্যাক () স্ট্যাকের সমস্ত কল প্রিন্ট করে।
রিচিহিন্দল

আপনি যদি আরও কিছু ভার্বোজ আউটপুট পেতে চান (ভার্স ইত্যাদি সহ), এই সম্পর্কিত প্রশ্নটি দেখুন এবং এটি একটি
অ্যালবার্ট

@ ব্যবহারকারী 2284570: আপনি ব্যবহার করতে পারেন sys._current_frames()। উদাহরণস্বরূপ py_better_exchookdump_all_thread_tracebacks এটি করে (দাবি অস্বীকার: আমি এটি লিখেছি)।
অ্যালবার্ট

93
import traceback
traceback.print_stack()

8
আসলে, আমি পছন্দ করি traceback.print_exc()যা আপনাকে প্রায় একই জিনিস দেয় যা আপনি exceptবিবৃতি ব্যতীত অর্জন করতে পারতেন (এবং এটি স্বীকৃত উত্তরের চেয়ে কম কোডিংও হয়)।
মার্টিনো

34
traceback.print_exc()আপনি যে কোনও ব্যতিক্রম হ্যান্ডেল করতে পারেন তার জন্য স্ট্যাক ট্রেস মুদ্রণ করে - তবে এটি মূল প্রশ্নটি সমাধান করে না, যা বর্তমান স্ট্যাকটি কীভাবে প্রিন্ট করা যায় (যখন আপনি এখন "তার বিপরীতে" যেখানে আপনার কোডটি ছিল যখন সর্বশেষ ব্যতিক্রম হয়েছিল তখন বন্ধ, যদি থাকে "।)
টম সায়ার্লি

44

inspect.stack() ব্যতিক্রম ট্রেসব্যাকের পরিবর্তে বর্তমান স্ট্যাকটি প্রদান করে:

import inspect
print inspect.stack()

লগ_স্ট্যাক ইউটিলিটি ফাংশনের জন্য https://gist.github.com/FredLoney/5454553 দেখুন ।


17

আপনি যদি পাইথন ডিবাগারটি ব্যবহার করেন তবে কেবল ভেরিয়েবলের ইন্টারেক্টিভ প্রোবইনিং হবে না তবে আপনি "যেখানে" কমান্ড বা "ডাব্লু" দিয়ে কল স্ট্যাক পেতে পারেন।

সুতরাং আপনার প্রোগ্রামের শীর্ষে

import pdb

তারপরে কোডটি যেখানে আপনি দেখতে চাইছেন তা কী হচ্ছে

pdb.set_trace()

এবং আপনি একটি প্রম্পটে ফেলে দেওয়া হবে


2
আমি এক দশক ধরে পাইথনে প্রোগ্রামিং করছি। আছে তাই অনেক বার আমি এই ব্যবহার করেছেন করতে পারে! আমি বিশ্বাস করতে পারি না আমি এখনই এটি সম্পর্কে সন্ধান করছি।
হোস্টফোর্ড 42

1
এর সাথে কীভাবে সম্পর্ক রয়েছে where?
skia.heliou

4
প্রশ্নের "কোথায়" অংশটির উত্তর দিতে: আপনি পিডিবি প্রম্পট পাওয়ার পরে (pdb) কেবল টাইপ করুন whereএবং এটি স্ট্যাক ট্রেসটি টার্মিনালে প্রিন্ট করবে।
স্টেফেন মিম

1
পাইথন ৩.7 এবং তারপরে একটি বিল্টিন ফাংশন রয়েছে breakpoint()যা পিডিবি আমদানির প্রয়োজনকে বাধা দেয়।
ব্যবহারকারী 650654

6

পিডিবি ব্যবহার করার সময় যাদের কল স্ট্যাক প্রিন্ট করতে হবে তাদের জন্য ঠিক করুন

(Pdb) where

2

এখানে @ রিচিহিন্ডেলের দুর্দান্ত উত্তরের একটি প্রকরণ রয়েছে যা একটি সাজসজ্জারকে কার্যকর করে যা পছন্দসইভাবে পছন্দসইভাবে ফাংশনে প্রয়োগ করা যেতে পারে। পাইথন 2.7.14 এবং 3.6.4 নিয়ে কাজ করে।

from __future__ import print_function
import functools
import traceback
import sys

INDENT = 4*' '

def stacktrace(func):
    @functools.wraps(func)
    def wrapped(*args, **kwds):
        # Get all but last line returned by traceback.format_stack()
        # which is the line below.
        callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
        print('{}() called:'.format(func.__name__))
        print(callstack)
        return func(*args, **kwds)

    return wrapped

@stacktrace
def test_func():
    return 42

print(test_func())

নমুনা থেকে আউটপুট:

test_func() called:
    File "stacktrace_decorator.py", line 28, in <module>
    print(test_func())
42

আমি এটি দেখার আগে আমার নিজের সাজসজ্জার সংস্করণ লিখেছি। সম্মত।
সিডা চাউ

0

এটি পরিদর্শন- ইনস্টল করুন

pip3 install inspect-it --user

কোড

import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])

আপনি এই লাইনের একটি স্নিপেট তৈরি করতে পারেন

এটি আপনাকে একটি ফাইল নাম এবং লাইন নম্বর সহ ফাংশন কল স্ট্যাকের একটি তালিকা প্রদর্শন করবে

আপনি এই লাইনটি যেখানে রেখেছেন শুরু থেকে তালিকা করুন

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