Python 什么是main.py?

Python 什么是main.py?,python,Python,\uuuu main\uuuuuuuuuuuuuupy文件是什么,我应该把什么类型的代码放进去,什么时候应该有一个?\uuuuuuuu main\uuuupy.py用于zip文件中的python程序。当zip文件运行时,将执行\uuuuuu main\uuuuuuuuuuuuy.py文件。例如,如果zip文件是这样的: test.zip __main__.py 而\uuuu main\uuuuu.py的内容是 import sys print "hello %s" % sys.arg

\uuuu main\uuuuuuuuuuuuuupy文件是什么,我应该把什么类型的代码放进去,什么时候应该有一个?

\uuuuuuuu main\uuuupy.py
用于zip文件中的python程序。当zip文件运行时,将执行
\uuuuuu main\uuuuuuuuuuuuy.py
文件。例如,如果zip文件是这样的:

test.zip
     __main__.py
\uuuu main\uuuuu.py
的内容是

import sys
print "hello %s" % sys.argv[1]
然后,如果我们运行
python test.zip world
,我们将得到
hello world


因此,当在zip文件上调用python时,
\uuuuuu main\uuuuuuuuuuuuuuuuuuuuuupy
文件将运行。

如果脚本是目录或zip文件而不是单个python文件,则在将“脚本”作为参数传递给python解释器时,
\uuuuuuu main\uuuuuuuuuuuuuuuuuuuuuuuupy.py
通常,Python程序通过在命令行上命名.py文件来运行:

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

$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
您必须自己决定应用程序是否能从这样的执行中获益


请注意,
\uuuuuu main\uuuuu
模块通常不来自
\uuuuuu main\uuuuuuu.py
文件。它可以,但通常不会。当您运行类似于
python my_program.py
的脚本时,该脚本将作为
\uuuuu main\uuuu
模块而不是
my_program
模块运行。对于作为python-MYU模块运行的模块,或者以其他几种方式运行的模块,也会发生这种情况


如果您在错误消息中看到名称
\uuuuuuu main\uuuuu
,这并不一定意味着您应该查找
\uuuuuu main\uuuuuy.py
文件

$ python -m yourpackage
\uuuu main\uuuuu.py
文件用于什么? 创建Python模块时,通常会使模块在作为程序入口点运行时执行某些功能(通常包含在
main
函数中)。这通常是通过在大多数Python文件的底部放置以下常用习惯用法来完成的:

if __name__ == '__main__':
    # execute only if run as the entry point into the program
    main()
对于具有
\uuuu main\uuuuu.py
的Python包,您可以获得相同的语义,该包可能具有以下结构:

。
└── 演示
├── __初始值
└── __主管道
要查看这一点,请将以下内容粘贴到Python 3 shell中:

从pathlib导入路径
demo=Path.cwd()/“demo”
demo.mkdir()
(demo/'\uuu init\uuuu.py')。写入文本(“”
打印('demo/\uuuuu init\uuuuu.py executed')
def main():
打印('main()已执行')
""")
(demo/''uuuuu main'.py')。写入文本(“”
打印('demo/\uuuuuu main\uuuuuuuuuu.py executed')
从演示导入主
main()
""")
我们可以将demo视为一个包并实际导入它,它执行
\uuuu init\uuuuu.py
中的顶级代码(但不是
main
函数):

导入演示 demo/\uuuu init\uuuuu.py已执行
当我们使用包作为程序的入口点时,我们执行
\uuuuuu main\uuuuuuuuuuuuuuupy
中的代码,该代码首先导入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

$python-m演示
demo/\uuuu init\uuuuu.py已执行
已执行演示/_____;u main.py
main()已执行
您可以从文档中得出这一点。报告说:

\uuuu main\uuuu
-顶级脚本环境
“\uuuu main”
是顶级代码执行的作用域的名称。 从标准中读取时,模块的
\uuuu name\uuuuuuuu
设置为等于
'\uuuuu main\uuuuuu'
输入、脚本或来自交互式提示的内容

模块可以发现它是否在主作用域中运行 通过检查它自己的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,它允许一个通用 当模块作为脚本或脚本运行时,有条件地执行模块中的代码 使用
python-m
但在导入时不使用:

if __name__ == '__main__':
     # execute only if run as a script
     main()
对于包,通过包含
\uuuu main\uuuuu.py
模块,当使用
-m
运行模块时,将执行模块的内容

拉链 您还可以将此目录(包括
\uuuu main\uuuuu.py
)压缩到一个文件中,并从命令行运行它,如下所示-但请注意,压缩包不能作为入口点执行子包或子模块:

从pathlib导入路径
demo=Path.cwd()/“demo2”
demo.mkdir()
(demo/'\uuu init\uuuu.py')。写入文本(“”
打印('demo2/\uuuuu init\uuuuuu.py executed')
def main():
打印('main()已执行')
""")
(demo/''uuuuu main'.py')。写入文本(“”
打印('demo2/\uuuuuuuu main\uuuuuuuuuuuuuuu.py已执行')
从_u初始化_uu导入主
main()
""")
请注意细微的变化-我们从
\uuuu init\uuuu
导入
main
,而不是
demo2
-此压缩目录不被视为一个包,而是一个脚本目录。因此,必须在没有
-m
标志的情况下使用它

特别是与问题相关的-
zipapp
默认情况下会导致压缩目录执行
\uuuu main\uuuuuuuuuuuuuuuupy
,并在
\uuuuuu init\uuuuuuuuuuuupy
之前首先执行:

$python-m zipapp demo2-o demo2zip
$python demo2zip
已执行demo2/___;u main.py
已执行demo2/_初始化.py
main()已执行

请再次注意,此压缩目录不是一个包-您也不能导入它。

这里的一些答案意味着给定一个“包”目录(带或不带显式
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py
文件),包含
.py,使用
-m
开关运行该目录与不使用开关运行该目录没有区别

最大的区别是,如果没有
-m
开关,首先将“package”目录添加到路径(即sys.path),然后文件正常运行,没有包语义

而使用
-m
开关,包语义(包括相对导入)得到尊重
:~/PkgTest$ tree
.
├── pkgname
│   ├── __main__.py
│   ├── secondtest.py
│   └── testmodule.py
└── testmodule.py
:~/PkgTest$ cat pkgname/__main__.py
import os
print( "Hello from pkgname.__main__.py. I am the file", os.path.abspath( __file__ ) )
print( "I am being accessed from", os.path.abspath( os.curdir ) )
from  testmodule import main as firstmain;     firstmain()
from .secondtest import main as secondmain;    secondmain()
:~/PkgTest$ python3 pkgname
Hello from pkgname.__main__.py. I am the file ~/PkgTest/pkgname/__main__.py
I am being accessed from ~/PkgTest
Hello from testmodule.py. I am the file ~/PkgTest/pkgname/testmodule.py
I am being accessed from ~/PkgTest
Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "pkgname/__main__.py", line 10, in <module>
    from .secondtest import main as secondmain
ImportError: attempted relative import with no known parent package
:~/PkgTest$ python3 -m pkgname
Hello from pkgname.__main__.py. I am the file ~/PkgTest/pkgname/__main__.py
I am being accessed from ~/PkgTest
Hello from testmodule.py. I am the file ~/PkgTest/testmodule.py
I am being accessed from ~/PkgTest
Hello from secondtest.py. I am the file ~/PkgTest/pkgname/secondtest.py
I am being accessed from ~/PkgTest