__main__.py文件是用来做什么的,我应该把什么类型的代码放进去,什么时候应该有一个?
通常,通过在命令行中命名.py文件来运行python程序:
$ python my_program.py
您还可以创建一个包含代码的目录或压缩文件,并包括一个__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文件。
我发现python -m program_dir和python program_dir有点不同:后者从不在目录中运行__init__.py(如果有)。
@布莱克:现在似乎不是这样。我刚试过python3 program_dir,它运行__init__.py。
@mk12我使用python 2.7。所以…
__main__.py文件的用途是什么?
创建python模块时,通常让模块在作为程序入口点运行时执行一些功能(通常包含在main函数中)。这通常是通过在大多数python文件的底部放置以下常见的习惯用法来完成的:
if __name__ == '__main__':
# execute only if run as the entry point into the program
main()
对于使用__main__.py的python包,您可以获得相同的语义。这是一个Linux shell提示,$,如果Windows上没有bash(或其他posix shell),只需在demo/____.py上创建这些文件,内容在EOF之间:
$ 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命令末尾输入ctrl+d(文件结束字符),可以在不使用<< EOFs和结束EOF的情况下执行上述操作)
现在:
$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed
你可以从文档中得到这个。文件上说:
__main__ — Top-level script environment
'__main__' is the name of the scope in which top-level code executes.
A module’s __name__ is set equal to '__main__' when read from standard
input, a script, or from an interactive prompt.
A module can discover whether or not it is running in the main scope
by checking its own __name__, which allows a common idiom for
conditionally executing code in a module when it is run as a script or
with python -m but not when it is imported:
if __name__ == '__main__':
# execute only if run as a script
main()
For a package, the same effect can be achieved by including a
__main__.py module, the contents of which will be executed when the module is run with -m.
拉链
您也可以将它打包成一个单独的文件,然后像这样从命令行运行它-但是请注意,压缩包不能作为入口点执行子包或子模块:
$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed
__main__.py用于zip文件中的python程序。运行zip文件时将执行__main__.py文件。例如,如果zip文件是这样的:
test.zip
__main__.py
其中__main__.py的含量为
import sys
print"hello %s" % sys.argv[1]
然后,如果我们运行python test.zip world,我们将把hello world取出来。
因此,当对zip文件调用python时,__main__.py文件将运行。
在yourpackage中创建__main__.py使其可执行为:
$ python -m yourpackage
如果只有程序作为模块可访问,那么-m才有效,否则可以使用python注:没有-m选项
@Benyaminjafari不能编写不能作为模块访问的命令行python程序。也许你是指package?
当我们创建一个包含main.py的python包来运行它时,python -m不起作用,-m是一个冗余选项,但是python工作得很好。
如果脚本是目录或zip文件而不是单个python文件,则当"script"作为参数传递给python解释器时,将执行__main__.py。