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