所以我启动了pyscripter,并在其中获得了一个文件:
def main():
pass
if __name__ == '__main__':
main()
那是什么?为什么我的程序在没有它的情况下工作?无论如何,这是什么目的?
我的代码会在哪里?让我们说一个打印hello world的函数。那会怎么样?我会在哪里叫它?
答案 0 :(得分:12)
目的基本上是您可以定义一个中心入口点,当且仅当脚本直接运行时。因为__name__
只会等于'__main__'
,所以如果它自己运行。将脚本的实际内容放入单独的函数允许其他脚本导入所述函数并在需要时运行它,因此在导入脚本时它不会立即运行。
当你只是需要快速的东西时,它也经常在libary模块中用来有一些默认行为。例如,http.server
模块提供了一个广泛的功能,可以创建您自己的HTTP服务器,具有您能想到的任何功能。如果您只是想快速让一个简单的服务器监听并静态传递文件,那么从命令行运行时就可以使用该模块的默认行为。
在命令行上运行python3 -m http.server
将完全这样做;运行http.server
模块,该模块本身将在其__name__ == '__main__
块中启动一个简单的HTTP服务器。
回应你的评论:
对于正常模块,作为库,包含类型或函数,您的应用程序需要,您不需要main
函数或主块。对于直接调用的脚本,例如实际启动应用程序的启动脚本,您将拥有某种未封装在函数或类中但直接运行的代码。那将是一个东西,你可以放入一个主要功能,然后你单独调用。这使您可以更自由地放置代码。例如,您可以直接在文件的开头使用main
函数,而在其中调用的其他函数将进一步定义到文件中。然后脚本的最后一部分是main()
。您不一定需要将其置于if __main__ == '__main__':
条件,您可以直接调用它。例如,您的脚本可能如下所示:
def main ():
# doing something
utilityFunction(...)
otherUtilityFunction(...)
def utilityFunction (...):
...
def otherUtilityFunction (...):
...
main()
如果你没有把代码放到一个单独的函数中,你必须在底部进行所有处理(在你的函数定义之后),如果你只想快速查看你的内容,这可能会适得其反在直接调用脚本时执行。
现在,正如我所说,你不需要把它放入主条件块;你可以直接调用它。但是,如果由于某种原因你需要包含该文件,例如因为你想将它封装到其他东西中,或者如果你想从交互式shell(IDLE或其他东西)重复调用它,你可能不会想要在导入模块时运行main()
,但只有在想要实际执行其功能时才运行。那就是你应该把main()
置于条件中的地方;这样,除非你直接执行模块,否则它不会被执行。
一般来说,总是将main()
调用放入这样的条件并不是一个坏主意,因为它永远不会受到伤害,但往往会在稍后的某些时候变得有用。
答案 1 :(得分:3)
执行python文件时,__name__
全局设置为__main__
,
当您导入文件时,它会被设置为它的名称。
该构造允许您仅在执行文件时执行某些代码。
例如,如果您有文件mymain.py
:
def main():
print('Hello, World!')
if __name__ == '__main__':
main()
您获得此结果:
$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymain # main() *not* executed
>>> mymain.main()
Hello, World!
在没有执行代码的情况下导入文件通常很有用。通过这种方式,主要功能可以由第三方软件调用,而无需创建新进程并允许它们在运行之前更改某些内容。
因此,没有必要,但使用它是一种好习惯。通常,您会意识到某个程序的某些函数/类可能对其他程序有用,因此能够在不执行主程序的情况下导入文件是一种很好的做法。
与具有if __name__ == '__main__':
块的Java相比,就像拥有一个只有main
方法的类并使用其他类来完成他的工作,而不使用它就像拥有main
类中的方法也提供其他功能(例如某种类型的容器或任何具有执行主程序的main
方法的方法)。
答案 2 :(得分:2)
Python中的所有内容都是一个声明,没有声明这样的东西(例如,def
是一个创建函数对象并将其绑定到名称的语句)。导入模块意味着(在一些簿记之后)执行模块中的语句。同样,执行Python文件意味着将其作为模块导入。因此,只需将程序编写为模块级语句即可。
但当然,这不是可重复使用的。当“程序”也可以导入其他模块时,你将它放在一个函数中(还有一些其他的小优点)。但是,执行文件(python file.py
)除了定义该函数之外不会做任何事情。
输入__name__
,这是模块名称,等于“入口点”模块的'__main__'
。因此,条件检查模块是否已导入或作为脚本运行,并在后一种情况下完成其工作。
答案 3 :(得分:0)
对于“Hello world”,你实际上并不需要这个技巧,但是在你编写模块的情况下它很有用。 if __name__ == '__main__'
子句只有在脚本直接执行时才会运行main()
,而不是用作从另一个脚本导入的脚本。
答案 4 :(得分:0)
这个想法非常简单:你既可以将文件用作包(可以在某处导入),也可以用作纯脚本。如果该文件用作脚本,则Python的解释器变量“__name__
”包含“__main__
”而不是包的名称。
因此,我们测试__name__
是否设置为__main__
,这意味着我们处于脚本模式,如果是,我们执行“if”块中的代码。
您必须了解Java和Python之间的主要区别:在Python中,当解释器读取文件时,它会被执行 - >声明和代码都被解释,Python的许多功能都基于此。