本文是关于python脚本与模块的区分:
脚本和模块的区分
python脚本和模块
- 脚本
- 全局命名空间:在脚本中,代码执行在全局命名空间下,这意味着定义的函数和变量默认是全局的。
__main__
模块:当一个 Python 文件作为脚本直接运行时,Python 解释器会自动将它作为一个模块导入,并设置一个特殊的模块名__main__
。- 运行方式:可以通过 Python 解释器直接运行脚本文件,如
python script.py
。
- 模块
- 局部命名空间:模块中定义的函数和变量位于它们自己的命名空间内,需要通过模块名进行引用。
__init__
初始化函数:模块有一个特殊的初始化函数(如果有的话)__init__.py
,当模块被导入时执行。- 导入方式:模块通过
import
语句被导入,如import mymodule
。
一个 .py 文件既可以当作脚本运行,也可以被导入作为模块使用。
- 关于
if __name__ == "__main__":
的使用
假设有一个名为 mymodule.py 的文件:
# mymodule.py
def greet(name):
print(f"Hello, {name}!")
#当 mymodule.py 被执行为脚本时,以下代码块会运行:
if __name__ == "__main__":
greet("World")
- 如果将
mymodule.py
当作脚本运行,使用命令python mymodule.py
,那么 greet(“World”) 将被执行。- 如果将
mymodule.py
当作模块导入另一个脚本中,使用命令import mymodule
,然后调用mymodule.greet("Alice")
,将输出 Hello, Alice!。
关于__init__初始化函数
当 Python 解释器导入一个包时,它会查找该目录下的 init.py 文件,并执行其中的代码。这使得该文件成为一个包初始化脚本
假设有一个名为 mypackage 的包
mypackage/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
submodule1.py
在 mypackage/__init__.py
中,可以通过以下方式导入和组织模块:
# mypackage/__init__.py
from .module1 import some_function as func1
from .module2 import SomeClass as MyClass
from .subpackage import submodule1
#定义可直接从 mypackage 访问的变量
CONSTANT = 'This is a constant from the mypackage package'
可以在其他 Python 脚本中这样使用
import mypackage
print(mypackage.CONSTANT) # 使用直接从包中访问的变量
mypackage.func1() # 使用在 __init__.py 中定义的别名
mypackage.MyClass() # 使用 __init__.py 中指定的类
mypackage.subpackage.submodule1.some_function() # 使用子模块中的函数