2010-06-16 36 views
55

Tôi có thể lấy tên tệp và số dòng trong tập lệnh python như thế nào.tên tệp và số dòng của tập lệnh python

Chính xác thông tin tệp chúng tôi nhận được từ một lần truy xuất ngoại lệ. Trong trường hợp này, không có ngoại lệ.

+0

Tôi đang downvoting bạn để bạn có thể nhận thấy rằng câu trả lời được chấp nhận của bạn là không chính xác. – philologon

+2

@philologon Chúc may mắn. Joey được nhìn thấy lần cuối cách đây 3 năm. –

+0

Đợi đã, sao anh ta không chấp nhận câu trả lời của chính mình ?! –

Trả lời

-4
inspect.currentframe().f_back.f_lineno 

Từ ActiveState Code.

+8

Điều này không đúng và dẫn đến số dòng của tệp FOO.pyc đã được biên dịch thay thế. Đây là những gì tôi sử dụng thay vì 'message = 'Code location {0.filename} @ {0.lineno}:'. Format (inspect.getframeinfo (inspect.currentframe()))' theo bài viết của @ arilou. –

+0

Tính năng này không hoạt động đúng khi bao gồm các tệp –

+18

Đối với tất cả nhân viên của Google: Đây không phải là câu trả lời đúng. ** TRẢ LỜI TRẢ LỜI PHẢI TRẢ LỜI **, với hơn 15 phiếu bầu. –

88

Nhờ mcandre, câu trả lời là:

from inspect import currentframe, getframeinfo 

frameinfo = getframeinfo(currentframe()) 

print frameinfo.filename, frameinfo.lineno 
+1

Việc sử dụng phương pháp này có tác động đến hiệu suất hay không (chẳng hạn như tăng nhỏ trong hoạt động) thời gian hoặc nhiều CPU cần thiết)? – gsinha

+3

@gsinha: Mọi cuộc gọi hàm đều có tác động hiệu suất. Bạn phải đo lường nếu tác động này là chấp nhận được cho bạn. – omikron

+0

Vì vậy, nếu bạn thích câu trả lời kiểu "một dòng", hãy sử dụng: 'kiểm tra nhập inspect.getframeinfo (inspect.currentframe()). Lineno' –

6

Tên tập tin: __file__ hoặc sys.argv[0]
Line: inspect.currentframe().f_lineno (không inspect.currentframe() f_back.f_lineno như đã đề cập ở trên.)

+0

' NameError: global name '__file__' không được định nghĩa' trên trình thông dịch Python của tôi: 'Python 2.7.6 (mặc định, ngày 26 tháng 9 năm 2014, 15:59:23)'. Xem http://stackoverflow.com/questions/9271464/what-does-the-file-variable-mean-do/9271617#comment33090606_9271479 – bgoodr

16

Cho dù bạn sử dụng currentframe().f_back tùy thuộc vào việc bạn đang sử dụng chức năng hay không.

Calling kiểm tra trực tiếp:

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 

Gọi một chức năng nào đó cho bạn:

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() 
+0

Ngoài ra, để cung cấp giải pháp trong chức năng có thể gọi. Rất đẹp! – MikeyE

3
import inspect  

file_name = __FILE__ 
current_line_no = inspect.stack()[0][2] 
current_function_name = inspect.stack()[0][3] 

#Try printing inspect.stack() you can see current stack and pick whatever you want 
+0

Tương tự như '__file__': Xem http://stackoverflow.com/questions/3056048/filename-and-line-number-of-python-script#comment74661035_10623150 – bgoodr

3

Chỉ cần đóng góp,

có một mô-đun linecache trong python, đây là hai liên kết có thể trợ giúp.

linecache module documentation
linecache source code

Trong một nghĩa nào đó, bạn có thể "đổ" một tập tin toàn bộ vào bộ nhớ cache của nó, và đọc nó với dữ liệu linecache.cache từ lớp.

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 

Đối với thông tin bổ sung, xử lý lỗi, bạn có thể chỉ cần sử dụng

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

Handy nếu sử dụng trong một tập tin phổ biến - in tên, số dòng và chức năng của người gọi file:

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

tốt hơn để sử dụng sys also-

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

Đầu ra là:

['__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 
Các vấn đề liên quan