__name__ ==“ __main__”怎么办?
给定以下代码,该if __name__ == "__main__":
怎么办?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
简而言之,就像C编程语言中的
main
函数一样,它是运行文件的入口点。所有的答案都解释了功能。但是,我将提供其用法的一个示例,这可能有助于进一步澄清该概念。
假设您有两个Python文件a.py和b.py。现在,a.py导入b.py。我们运行a.py文件,其中首先执行“ import b.py”代码。在其余的a.py代码运行之前,文件b.py中的代码必须完全运行。
在b.py代码中,有一些代码是该文件b.py所独有的,并且我们不希望导入b.py文件的任何其他文件(b.py文件除外)来运行它。
这就是这行代码检查的内容。如果它是运行代码的主文件(即b.py)(在这种情况下不是)(a.py是运行的主文件),则仅执行代码。
如果此.py文件由其他.py文件导入,则“ if语句”下的代码将不会执行。
如果此.py是
python this_py.py
在shell下运行的,或在Windows中双击。“ if语句”下的代码将被执行。通常是为了测试而编写的。
python中的每个模块都有一个名为的属性
__name__
。__name__
attribute 的值__main__
是直接运行模块时(例如)python my_module.py
。否则(如您说的那样import my_module
)的值__name__
是模块的名称。简短说明一下小例子。
我们可以直接执行为
输出量
现在假设我们从其他脚本中调用上述脚本
当你执行这个
输出量
所以,以上是自我解释,当你调用其他脚本的测试,如果循环
__name__
中test.py
不会执行。fibo.py(名为的模块
fibo
)参考:https : //docs.python.org/3.5/tutorial/modules.html
考虑:
上面的输出是
__main__
。上面的陈述是正确的,并显示“ direct method”。假设他们在另一个类中导入了该类,则不会打印“直接方法”,因为在导入时会设置
__name__ equal to "first model name"
。的原因
主要是为了避免由于直接导入代码而导致的导入锁定问题。如果要直接调用文件(这种情况),则要运行,但是如果导入了代码,则导入程序必须从真正的主模块输入代码,以避免导入锁定问题。
main()
__name__ == "__main__"
副作用是您自动登录支持多个入口点的方法。您可以使用
main()
作为入口点运行程序,但不必如此。虽然setup.py
期望main()
,但其他工具使用备用入口点。例如,要将文件作为gunicorn
进程运行,请定义app()
函数而不是main()
。与一样setup.py
,gunicorn
导入您的代码,因此您不希望它在导入时执行任何操作(由于导入锁定问题)。在本页的所有答案中,我都读了很多东西。我想说的是,如果您知道这件事,那么您肯定会理解这些答案,否则,您仍然会感到困惑。
简而言之,您需要了解以下几点:
import a
action实际上会运行所有可以运行的内容a.py
,这意味着其中的每一行a.py
由于第1点,您可能不希望在
a.py
导入时运行所有内容为了解决第2点的问题,python允许您进行条件检查
__name__
是所有.py
模块中的隐式变量;当a.py
被导入,的值__name__
的a.py
模块设置为它的文件名“a
“; 当a.py
直接使用“python a.py
” 运行时,的值__name__
设置为字符串__main__
基于python如何
__name__
为每个模块设置变量的机制,您知道如何实现第3点吗?答案很简单,对吧?放置一个if条件:if __name__ == "__main__": // do A
,然后python a.py
运行该部分// do A
,并import a
跳过该部分“// do A
”;您甚至可以__name__ == "a"
根据您的功能需求放python特殊的重要一点是第4点!其余只是基本逻辑。
考虑:
它检查
__name__
Python脚本的属性是否为"__main__"
。换句话说,如果程序本身被执行,则属性为__main__
,因此程序将被执行(在这种情况下为main()
函数)。但是,如果模块使用了Python脚本,
if
则将执行该语句之外的任何代码,因此该代码if \__name__ == "\__main__"
仅用于检查程序是否用作模块,从而决定是否运行该代码。if __name__ == "__main__"
是使用(例如)命令从(例如)命令行运行脚本时运行的部分python myscript.py
。通过将脚本作为命令传递给Python解释器来运行脚本时,
缩进级别为0的所有代码都将执行。可以很好地定义已定义的函数和类,但是不会运行任何代码。与其他语言不同,没有任何
main()
函数可以自动运行-该main()
函数隐式是顶层的所有代码。在这种情况下,顶级代码是一个
if
块。__name__
是一个内置变量,其结果为当前模块的名称。但是,如果模块直接运行(如上myscript.py
所示),则将__name__
其设置为string"__main__"
。因此,您可以通过测试来测试您的脚本是直接运行还是通过其他方式导入如果将脚本导入另一个模块,则将导入其各种功能和类定义,并执行其顶层代码,但上述
if
子句的then-body中的代码将不会运行,因为条件是没见过。作为一个基本示例,请考虑以下两个脚本:现在,如果您将解释器调用为
输出将是
如果
two.py
改为运行:你得到
因此,在
one
加载模块时,其__name__
等于"one"
而不是"__main__"
。你的回答