什么是__main__.py?


Answers:


319

通常,通过在命令行上命名.py文件来运行Python程序:

$ python my_program.py

您还可以创建一个充满代码的目录或zipfile,并包含一个__main__.py。然后,您只需在命令行上命名目录或zipfile,它就会__main__.py自动执行:

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

您必须自己决定应用程序是否可以从这样的执行中受益。


请注意,__main__ 模块通常不是来自__main__.py文件。可以,但是通常不会。当您运行类似python my_program.py的脚本时,脚本将作为__main__模块而不是my_program模块运行。对于以以下方式运行的模块,也会发生这种情况:python -m my_module或以其他方式,。

如果__main__在错误消息中看到该名称,则不一定意味着您应该在寻找__main__.py文件。


22
我发现,python -m program_dirpython program_dir一点点不同:后者从来没有运行__init__.py在该目录(如果有的话)。
英国广播公司

5
@brk:现在似乎并非如此。我只是试了python3 program_dir一下就跑了__init__.py
mk12

@ mk12我刚刚尝试过,我可以确认@brk的发现:python3 dir运行__main__.py但不运行__init__.py,而同时python3 -m dir运行。
马塞洛·罗曼尼

1
@ mk12可能您有一些代码在__main__.py其中触发了__init__.py
wim

100

是什么 __main__.py文件是做什么用的?

创建Python模块时,通常在使该模块main作为程序的入口点运行时使其执行某些功能(通常包含在函数中)。通常,通过将以下常见用法放在大多数Python文件的底部来完成此操作:

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

您可以使用来获得与Python包相同的语义__main__.py。这是一个Linux Shell提示符,$如果您在Windows上没有Bash(或另一个Posix Shell),只需demo/__<init/main>__.pyEOFs 之间创建以下内容的文件:

$ 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中,可以通过在每个cat命令的末尾输入+ (文件末尾字符)来执行不带<< EOFs和以EOFs 结尾的上述操作)CtrlD

现在:

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

您可以从文档中得出。该文档说:

__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 demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed

31

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

test.zip
     __main__.py

和的内容__main__.py

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

然后,如果我们要跑步,python test.zip world我们就会hello world下车。

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


23

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

$ python -m yourpackage

1
-m如果只有程序可以作为模块访问,则可以工作,否则您可以使用python <yourpackage>注:不带-m选项
Benyamin Jafari

1
@BenyaminJafari无法编写无法作为模块访问的命令行Python程序。也许你是说package什么?
anatoly techtonik

1
当我们创建一个包含 .py 的Python包时,要运行它python -m <yourproject>是行不通的,它-m是一个多余的选项,但python <yourpackage>效果很好。
本雅明·贾法里

@BenyaminJafari -m标志在某些情况下确实有所不同。从目录执行a并假设脚本a/b/c/__main__.py... python -m b.c将从目录执行,a并且主脚本的导入将相对于a。但是python b/c将在dir的导入范围内执行c,因此像在主脚本中这样的任何导入import b.d都会失败。
MikeCPT

14

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.