虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。
Python代码在执行过程中,遵循下面的基本原则:
if __name__ == '__main__':
很多时候,我们经常在python程序中看到这么一行语句,这里简要解释一下:
首先,__name__
是所有模块都会有的一个内置属性,一个模块的__name__
值取决于你如何调用模块。假如你有一个test.py
文件,如果在a.py
文件中使用import导入这个模块import test.py
,那么test.py
模块的__name__
属性的值就是test
,不带路径或者文件扩展名。但是很多时候,模块或者说脚本会像一个标准的程序样直接运行,也就是类似python test.py
这种方式,在这种情况下, __name__
的值将是一个特别缺省值"__main__"
。
根据上面的特性,可以用if __name__ == '__main__'
来判断是否是在直接运行该py文件!如果是,那么if代码块下的语句就会被执行,如果不是,就不执行。该方法常用于对模块进行测试和调试,区分直接运行和被导入两种情况的不同执行方式!
我们通过下面的例子,脚本名为test.py,执行python test.py
看看实际的顺序执行方式:
import os # 1 print('<[1]> time module start') # 2 class ClassOne(): print('<[2]> ClassOne body') # 3 def __init__(self): # 10 print('<[3]> ClassOne.__init__') def __del__(self): print('<[4]> ClassOne.__del__') # 101 def method_x(self): # 12 print('<[5]> ClassOne.method_x') class ClassTwo(object): print('<[6]> ClassTwo body') # 4 class ClassThree(): print('<[7]> ClassThree body') # 5 def method_y(self): # 16 print('<[8]> ClassThree.method_y') class ClassFour(ClassThree): print('<[9]> ClassFour body') # 6 def func(): print("<func> function func") if __name__ == '__main__': # 7 print('<[11]> ClassOne tests', 30 * '.') # 8 one = ClassOne() # 9 one.method_x() # 11 print('<[12]> ClassThree tests', 30 * '.') # 13 three = ClassThree() # 14 three.method_y() # 15 print('<[13]> ClassFour tests', 30 * '.') # 17 four = ClassFour() four.method_y() print('<[14]> evaltime module end') # 100
if __name__ == '__main__':
,判断为True,于是执行if内部的代码__del__
方法,还要在最后执行它内部的代码#101这条打印语句。通过这个例子,相信你对Python的程序执行流程能够有一定的了解。其实这个过程,也是我们读别人代码的过程。
刘老师您好,请问本页的“python代码顺序执行”,能否使用logging方法或其他方法,把每条执行语句,按顺序记录成文件,包括:模块名、行号、行代码。期待您指导,非常感谢。
如果可以指定一个模块内一个起始位置,然后记录比如500条。那就最好了。
Python标准库`logging`模块可以帮助我们创建日志消息,但是要记录每条执行语句可能有些困难,这相当于需要实现一个Python的调试器。然而,我们可以使用`trace`模块来记录程序执行的轨迹。下面是一个简单的示例: ```python import trace # 创建一个Trace对象 tracer = trace.Trace(count=True, trace=True) # 执行一个函数的跟踪,这里假设你的函数叫做my_function() tracer.runfunc(my_function) # 生成一个报告,保存到文件中 r = tracer.results() with open('trace_report.txt', 'w') as f: r.write_results(show_missing=True, summary=True, coverdir=f) ``` 在这个例子中,`trace.Trace(count=True, trace=True)`将创建一个Trace对象,它会跟踪Python的执行。然后,`tracer.runfunc(my_function)`将执行函数`my_function()`并记录其执行过程。最后,`r.write_results(show_missing=True, summary=True, coverdir=f)`将将执行结果写入文件。 注意,这个跟踪器将记录所有的函数调用和代码行,所以它可能会生成大量的输出,尤其是在大型项目中。而且,由于它需要记录所有的行,这可能会导致你的程序运行速度变慢。 另外,`logging`模块适用于记录程序运行时的状态或者发生的事件(比如错误,信息,警告等)。要使用`logging`模块,可以在你的代码的各个部分添加日志消息,如下所示: ```python import logging logging.basicConfig(filename='my_application.log', level=logging.INFO) logging.info('This message will go to the log file') ``` 在这个例子中,`logging.basicConfig(filename='my_application.log', level=logging.INFO)`设置了日志的基本配置,如日志文件的名称和日志的最低等级。然后,`logging.info('This message will go to the log file')`将一条信息级别的日志消息写入到日志文件中。 这两个方法各有用途,可以根据你的需求选择合适的方法。
if __name__ == '__main__'用于模块测试(test.py)。模块写完了,测试运行是否正确。有2种测试方式: 1:不写if __name__ == '__main__',直接在test.py里面写测试。 2:写if __name__ == '__main__'后,在test.py里面写测试。 其他模块(other.py)调用test模块时,会遇到2种情况: 1:会执行test.py的测试代码,容易引入未知错误。 2:只执行test.py的正常代码,不执行if __name__ == '__main__'后的测试代码。