2010-10-28 65 views
188

什么是__main__.py文件,我应该把什么样的代码放进去,什么时候应该放一个?什么是__main__.py?

+0

'__init __。py'服务的目的不同于'__main __。py' - 并不真正理解为什么这被标记为重复。 RAS,你能解释一下吗? – 2017-10-14 13:26:38

回答

193

通常情况下,一个Python程序由命令行上命名.py文件运行:

$ python my_program.py 

您还可以创建一个目录或压缩文件的完整代码,包括__main__.py。然后,你可以简单地命名的目录或zip文件在命令行上,并自动执行__main__.py

$ python my_program_dir 
$ python my_program.zip 
# Or, if the program is accessible as a module 
$ python -m my_program 

你必须自己决定你的应用程序是否能够从这样的正在执行中获益。

18

__main__.py用于zip文件中的python程序。当运行zip文件时,__main__.py文件将被执行。例如,如果压缩文件是这样:

test.zip 
    __main__.py 

__main__.py内容是

import sys 
print "hello %s" % sys.argv[1] 

然后如果我们运行python test.zip world我们会得到hello world出来。

因此,__main__.py文件在zip文件上调用python时运行。

11

如果您的脚本是一个目录或ZIP文件而不是一个Python文件,当“脚本”作为参数传递给python解释器时,将会执行__main__.py

12

创建__main__.pyyourpackage使其可执行文件:

$ python -m yourpackage 
42

什么是__main__.py文件?

当创建Python模块时,通常使模块在作为程序的入口点运行时执行某些功能(通常包含在main函数中)。这通常是与放置在最Python文件底部以下常见成语做:

if __name__ == '__main__': 
    # execute only if run as the entry point into the program 
    main() 

你可以得到一个Python包相同的语义与__main__.py。这是Linux命令提示符下,$,如果你没有在Windows击(或其他Posix的外壳)就在demo/__<init/main>__.py with contents in between the EOF`s创建这些文件:

$ mkdir demo 
$ cat > demo/__init__.py << EOF 
print('demo/__init__.py executed') 
def main(): 
    print('main executed') 
EOF 
$ cat > demo/__main__.py << EOF 
print('demo/__main__.py executed') 
from __init__ import main 
main() 
EOF 

(在一个POSIX/Bash shell中,你能做到以上没有<< EOF S和按下Ctrl-d,结束文件的字符结束EOF S,在每个cat命令结束)

现在:

$ python demo 
demo/__main__.py executed 
demo/__init__.py executed 
main executed 

你可以从文档中导出离子。该documentation说:

__main__ - 顶层脚本环境

'__main__'是在顶级代码执行范围的名称。 当从标准 输入,脚本或交互式提示中读取时,模块的__name__设置为等于'__main__'

模块可以通过检查自己的__name__,允许 一个常见的成语有条件地执行代码的模块中,当它运行的脚本或 与python -m,但发现它是否在范围主要 运行不是当它被导入:

if __name__ == '__main__': 
     # execute only if run as a script 
     main() 

对于打包,相同的效果可以通过包括 __main__.py模块,其内容在当模块与-m运行将被执行而实现。

拉链

您也可以打包这成一个单一的文件,并从这样的命令行运行它 - 但是请注意,压缩包无法执行子包或子模块的入口点:

$ python -m zipfile -c demozip demo/* 
$ python demozip 
demo/__main__.py executed 
demo/__init__.py executed 
main() executed 
相关问题