使用 python3 xxx.py 和 python3 -m xxx.py 有什么区别
- 我们通过对应的参数解释可以得知,就是把某个
Python
模块当做脚本来运行,而为什么需要这样做呢?
➜ python --help
usage: /Users/escape/.pyenv/versions/MoviesList/bin/python [option] ... [-c cmd | -m mod | file | -] [a
Options and arguments (and corresponding environment variables):
-m mod : run library module as a script (terminates option list)
- 常见的
Python
文件的运行方式,有如下两种方式,而他们究竟有什么区别呢?
# 直接运行
$ python3 app/test.py
# 模块运行
$ python3 -m app.test
- 其实,核心的知识点就是:不同的加载
py
文件的方式会影响sys.path
这个变量的值。而sys.path
究竟有何意义呢?这里,我们可以简单理解为Linux
操作系统中的PATH
变量。其用于是指定当前Python
解释器的运行环境,告诉Python
解释器应该这那些目录下去寻找依赖的库!举个例子,来说明下面。
➜ tree .
.
└── lib
├── __init__.py
└── app.py
import sys
def main():
for line in sys.path:
print(line)
if __name__ == '__main__':
print(__name__)
main()
# 直接运行
__main__
/Users/escape/Fuckcode/MoviesList/lib
/Users/escape/.pyenv/versions/3.9.0/lib/python39.zip
......
# 模块运行
➜ python -m lib.app
__main__
/Users/escape/Fuckcode/MoviesList
/Users/escape/.pyenv/versions/3.9.0/lib/python39.zip
......
- 仔细观察输出的话,很容易发现:直接运行的方式,第一个搜索的路径是子模块目录;以模块运行的方式,第一个搜索路径是当前目录。而这样作用又有什么好处呢?好处在于,当我们运行的
Python
文件中相对引入其他模块的话,不会报错。
➜ tree .
.
├── app
│ ├── __init__.py
│ └── test.py
└── lib
├── __init__.py
└── app.py
这里补充下,
sys.path
变量的初始值的来源。
- 第一次导入模块步骤:之后直接从内存加载
- [1] 搜集并找到对应模块文件
- [2] 在必要时把模块文件编译成字节码
- [3] 执行模块的代码来创建所定义的对象
- 搜索路径顺序
- [1] 程序的主目录
- [2]
PYTHONPATH
系统变量 - [3] 标准库目录
- [4]
.pth
文件
- 搜索文件类型
- [1]
a.py
代码源文件 - [2]
a.pyc
字节码文件 - [3] 目录
a
作为包导入 - [4]
s.so
、a.dll
、a.pyd
编译扩展文件 - [5] 用
c
编译好的内置模块 - [6]
zip
文件包
- [1]
# 搜索路径都汇总在sys.path变量里面
# 可以通过对sys.path的操作达到我们需要的效果
In [1]: import sys
In [2]: sys.path
Out[2]:
['',
'/usr/local/bin',
'/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
'/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
'/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
'/usr/local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/site-packages/IPython/extensions',
'/Users/escape/.ipython']