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ệ.
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ệ.
inspect.currentframe().f_back.f_lineno
Từ ActiveState Code.
Đ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. –
Tính năng này không hoạt động đúng khi bao gồm các tệp –
Đố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. –
Nhờ mcandre, câu trả lời là:
from inspect import currentframe, getframeinfo
frameinfo = getframeinfo(currentframe())
print frameinfo.filename, frameinfo.lineno
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
@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
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' –
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.)
' 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
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()
Ngoài ra, để cung cấp giải pháp trong chức năng có thể gọi. Rất đẹp! – MikeyE
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
Tương tự như '__file__': Xem http://stackoverflow.com/questions/3056048/filename-and-line-number-of-python-script#comment74661035_10623150 – bgoodr
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())
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])
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
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
@philologon Chúc may mắn. Joey được nhìn thấy lần cuối cách đây 3 năm. –
Đợi đã, sao anh ta không chấp nhận câu trả lời của chính mình ?! –