Python程序的执行方式有两种,一种是交互式编程,一种是文件执行方式。交互式编程是在命令行或者IDLE中直接输入代码,按回车键就可以运行代码,并立即看到输出结果。文件执行方式是创建一个源文件,将所有代码放在源文件中,让解释器逐行读取并执行源文件中的代码,直到文件末尾。1
交互式编程的优点是可以快速测试和调试代码,适合一些简单的任务或者学习Python的基本语法。缺点是不能保存代码,每次运行都要重新输入,不适合复杂的项目开发。2
文件执行方式的优点是可以保存代码,方便修改和重用,适合开发复杂的应用程序或者模块。缺点是需要创建和管理源文件,不能立即看到运行结果,需要使用命令或者工具来运行源文件。3
Python程序一般需要定义函数或者类等,如果让代码开始执行有几种实现方式,每一种方式使用的场景是什么,分别举一个例子:
# 这是一个简单的Python脚本
print("Hello, world!")
a = 10
b = 20
print(a + b)
# 这是一个复杂的Python应用程序
def main():
# 这里是主函数
print("This is the main function.")
# 调用其他函数或者类等
if __name__ == '__main__':
# 这里是程序入口
main()
在Python中,if __name__ == '__main__'
这种写法是用于模块的入口执行代码的。
__name__
是一个内置变量,它表示当前模块的名字。如果模块是被直接运行的,那么__name__ == '__main__'
为True。如果模块是被导入的,那么__name__
就是模块的名字,而不是'__main__'
。
举个例子:
# test.py
print('模块被执行')
if __name__ == '__main__':
print('模块被直接运行')
如果直接运行 test.py:
模块被执行
模块被直接运行
如果从另一个模块导入 test:
import test
输出:
模块被执行
可以看到,if __name__ == '__main__'
下的代码只在模块作为入口程序直接执行时才会被运行,而导入到其他模块中时不会被执行。
这可以让一个模块既能被导入,又能作为入口程序直接执行,非常方便。所以 Python 程序一般会这样写主入口:
if __name__ == '__main__':
# 主代码逻辑
这样模块导入时主代码逻辑就不会被运行,作为入口程序直接执行时主代码才会被执行。
所以这种写法其实是一种模块的代码组织方式,可以将不希望在导入时自动执行的代码放在这种条件检查下面。
好的,我来解释一下这种实现方式的原理和步骤。
首先,你需要知道什么是shebang(也叫做hashbang)。shebang是一种特殊的注释,它的作用是告诉操作系统的shell(比如bash或者zsh)用什么程序来执行这个文件。shebang必须写在文件的第一行,以#开头,紧跟着一个!,然后是程序的绝对路径。1
例如,如果你写了一个Python脚本,你想用/usr/bin/python3来执行它,那么你可以在文件的第一行写上:
#!/usr/bin/python3
这样,当你在shell中运行这个文件时,shell会自动调用/usr/bin/python3来执行这个文件。2
但是,这种方式有一个缺点,就是你必须知道程序的绝对路径,并且不同的系统可能有不同的路径。比如,有些系统可能把python3安装在/usr/local/bin/python3或者其他地方。3
为了解决这个问题,我们可以使用env命令来查找程序的路径。env命令可以根据环境变量PATH来搜索程序,并返回第一个匹配的结果。
所以,我们可以把shebang写成:
#!/usr/bin/env python3
这样,当我们运行这个文件时,shell会先调用/usr/bin/env python3来查找python3的路径,然后再用找到的路径来执行这个文件。
这种方式更加通用和可移植,因为它不依赖于程序的绝对路径,而是根据系统的环境变量来动态地确定路径。
但是,仅仅写了shebang还不够,我们还需要给文件添加可执行权限。否则,shell会认为这个文件是一个普通的文本文件,而不是一个可执行的程序。
给文件添加可执行权限的方法是使用chmod命令。chmod命令可以修改文件的权限模式,其中+x表示添加可执行权限。
例如,如果我们有一个名为hello.py的Python脚本,我们可以在shell中输入:
chmod +x hello.py
这样,我们就给hello.py添加了可执行权限。
最后,我们就可以直接运行这个文件了。我们只需要在shell中输入:
./hello.py
注意,在文件名前面加上./表示当前目录。如果你想运行其他目录下的文件,你需要指定相对或者绝对路径。
这样,shell会根据shebang来调用相应的程序来执行这个文件,并输出结果。