Python -m 参数的作用
在Python中,使用-m参数可以执行一个模块作为脚本。它是用于从命令行直接运行一个Python模块的标志。Python 会检索 sys.path ,查找名字为“name”的模块或者包(含命名空间包),并将其内容当成“main”模块来执行. 已知一个模块的名字,但不知道它的文件路径,那么使用“-m”就意味着交给解释器自行查找,若找到,则当成脚本执行。这种方式具有以下几个方面的作用:
-
直接执行模块代码: 使用python -m命令可以直接在命令行中执行一个Python模块,而不需要编写额外的启动脚本。这对于简单的脚本或工具非常方便,因为它们可以作为独立的可执行文件运行。
-
模块自测试: 当一个模块被设计为既可以作为库使用,又可以作为独立脚本运行时,可以将自测试代码放在__main__函数中,并使用python -m来运行该模块以进行测试。这样可以确保模块在被导入时正常运行,同时也能够通过直接执行来验证其功能。
-
环境隔离: 使用
python -m venv venv可以创建虚拟环境到venv文件夹下.其中venv就是一个内置的 Python 模块,用于创建虚拟环境。 -
避免名称冲突: 使用
python -m可以避免与其他具有相同名称的脚本或模块发生名称冲突。通过明确指定模块的完整名称,可以确保执行的是所需的模块。
注意如果是执行dir/test.py,命令为python3 -m dir.test
Python引入模块的问题
假设你的项目结构如下:
project/
├── main.py
├── package1/
│ ├── __init__.py
│ ├── module_a.py
├── package2/
│ ├── __init__.py
│ ├── module_b.py
如果你想在module_b中引入module_a模块,并单独执行module_b.py文件,你有两种执行方案:
-
python -m package2.module_b
-
通过设置
PYTHONPATH环境变量指定顶级目录,确保 Python 能识别包结构:export PYTHONPATH=$(pwd)
python package2/module_b.py
在 package2/module_b.py 中可以使用以下绝对导入语句:
from package1 import module_a
但如果使用相对导入:
from ..package1 import module_a
尽管使用相对导入看起来像是浏览文件系统,但是不能到定义包的目录之外,因此只能在project包外层调用: python -m project.package2.module_b