পাইথন স্ক্রিপ্টের ফাইল নাম এবং লাইন নম্বর


113

পাইথন স্ক্রিপ্টে আমি কীভাবে ফাইলের নাম এবং লাইন নম্বর পেতে পারি।

ঠিক একটি ফাইলের তথ্য আমরা একটি ব্যতিক্রম ট্রেসব্যাক থেকে পাই। এক্ষেত্রে ব্যতিক্রম না বাড়িয়েই।

উত্তর:


161

ম্যাকানড্রেকে ধন্যবাদ, উত্তরটি হ'ল:

#python3
from inspect import currentframe, getframeinfo

frameinfo = getframeinfo(currentframe())

print(frameinfo.filename, frameinfo.lineno)

1
এই পদ্ধতিটি ব্যবহারের কোনও কার্যকারিতা প্রভাব রয়েছে (যেমন রান চালানোর সময় সামান্য বৃদ্ধি বা আরও বেশি সিপিইউ প্রয়োজন)?
gsinha

6
@ জিঞ্জাহা: প্রতিটি ফাংশন কলের পারফরম্যান্স প্রভাব থাকে। এই প্রভাবটি আপনার পক্ষে গ্রহণযোগ্য কিনা তা আপনাকে মাপতে হবে।
ওমিক্রন

5
সুতরাং, আপনি যদি "একটি লাইন" টাইপ করেন তবে উত্তরগুলি ব্যবহার করুন:import inspect inspect.getframeinfo(inspect.currentframe()).lineno
1-ijk

1
@ লিমোকপ্লান্টেমোন যখন currentframe()ডাকা হয় তখন এটি ঘটে , যার অর্থ আপনি এটিকে আর সহজ করতে পারবেন না getframeinfo(currentframe()).lineno(যদি আপনি কেবলমাত্র লাইন নম্বরটির বিষয়ে খেয়াল রাখেন তবে ফাইলের নাম নয়)। Docs.python.org/2/library/inspect.html#inspect.currentframe
অ্যারন মিলার

1
@ জোয়ি, মুদ্রণ বিবৃতিতে বন্ধনী থাকা উচিত নয়?
এমসিজি

49

আপনি ব্যবহার currentframe().f_backকরছেন কিনা তা নির্ভর করে আপনি কোনও ফাংশন ব্যবহার করছেন কিনা তা নির্ভর করে।

কলিং সরাসরি পরিদর্শন:

from inspect import currentframe, getframeinfo

cf = currentframe()
filename = getframeinfo(cf).filename

print "This is line 5, python says line ", cf.f_lineno 
print "The filename is ", filename

আপনার জন্য এটি করে এমন একটি ফাংশন কল করা:

from inspect import currentframe

def get_linenumber():
    cf = currentframe()
    return cf.f_back.f_lineno

print "This is line 7, python says line ", get_linenumber()

2
কল প্ল্যাক এক সমাধান প্রদানের জন্য এক, প্লাস ওয়ান। খুব সুন্দর!
মাইকি

21

হ্যান্ডি যদি কোনও সাধারণ ফাইলে ব্যবহৃত হয় - ফাইলের নাম, লাইন নম্বর এবং কলারের কার্যকারিতা মুদ্রণ করে:

import inspect
def getLineInfo():
    print(inspect.stack()[1][1],":",inspect.stack()[1][2],":",
          inspect.stack()[1][3])

11

ফাইলের নাম :

__file__
# or
sys.argv[0]

লাইন :

inspect.currentframe().f_lineno

( inspect.currentframe().f_back.f_linenoউপরে বর্ণিত হিসাবে না )


NameError: global name '__file__' is not definedআমার পাইথন ইন্টারপ্রেটার করুন: Python 2.7.6 (default, Sep 26 2014, 15:59:23)। দেখুন stackoverflow.com/questions/9271464/...
bgoodr

10

সিএস ব্যবহার করা আরও ভাল-

print dir(sys._getframe())
print dir(sys._getframe().f_lineno)
print sys._getframe().f_lineno

আউটপুটটি হ'ল:

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
14

6

শুধু অবদান রাখতে,

linecacheপাইথনে একটি মডিউল রয়েছে, এখানে দুটি লিঙ্ক সহায়তা করতে পারে।

লিনিচেক মডিউল ডকুমেন্টেশন
লিনিচাস উত্স কোড

এক অর্থে, আপনি একটি সম্পূর্ণ ফাইলটিকে তার ক্যাশে "ডাম্প" করতে পারেন এবং এটি ক্লাসের লিনেকাচি। ক্যাশে ডেটা দিয়ে পড়তে পারেন।

import linecache as allLines
## have in mind that fileName in linecache behaves as any other open statement, you will need a path to a file if file is not in the same directory as script
linesList = allLines.updatechache( fileName ,None)
for i,x in enumerate(lineslist): print(i,x) #prints the line number and content
#or for more info
print(line.cache)
#or you need a specific line
specLine = allLines.getline(fileName,numbOfLine)
#returns a textual line from that number of line

অতিরিক্ত তথ্যের জন্য, ত্রুটি পরিচালনার জন্য, আপনি কেবল ব্যবহার করতে পারেন

from sys import exc_info
try:
     raise YourError # or some other error
except Exception:
     print(exc_info() )


3

পাইথন 3 এ আপনি এখানে একটি প্রকরণ ব্যবহার করতে পারেন:

def Deb(msg = None):
  print(f"Debug {sys._getframe().f_back.f_lineno}: {msg if msg is not None else ''}")

কোডে, আপনি তারপর এটি ব্যবহার করতে পারেন:

Deb("Some useful information")
Deb()

উৎপাদন করা:

123: Some useful information
124:

যেখানে 123 এবং 124 কলগুলি করা লাইন।


0

ভিএসকোড ১.৯৯.২ তে পাইথন ৩.7.৩ এ লাইন নম্বর পেতে আমার পক্ষে কী কাজ করে তা এখানে ( dmsgডিবাগ বার্তার জন্য আমার স্মৃতিচারণমূলক বিষয়):

import inspect

def dmsg(text_s):
    print (str(inspect.currentframe().f_back.f_lineno) + '| ' + text_s)

একটি ভেরিয়েবল name_sএবং এর মান দেখাচ্ছে কল করতে :

name_s = put_code_here
dmsg('name_s: ' + name_s)

আউটপুট এর মতো দেখাচ্ছে:

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