python代码运行逻辑
项目结构如下,有test1, test2两个文件夹,test1下有a.py文件,test2下有b.py文件
其中a.py文件定义了个A类,输出打印结果
我们在b.py文件里调用a.py文件的A类
接下来我们用三种方式运行b.py文件
1、第一种方法是图形界面直接运行
运行结果:
报错显示 没有名为“test1”的模块
先不管,我们接着看第二种运行方式
2、第二种运行方式为命令行直接运行,输入命令
python3 test2.b
运行结果:
又失败了
报错显示 不能打开以下文件,没有这样的文件或目录
嘿,有意思,报的错还和第一种不一样
我们接着看第三种运行方式
3、第三种运行方式和第二种很像,只不过加多了一个参数 -m,输入命令
python3 -m test2.b
运行结果:
竟然运行成功了
为什么前两种运行方式都不行,且报错还不一致,第三种方式却成功了?
百思不得其解
python运行代码的逻辑到底是怎样的
我们先把b.py文件先前的代码注释掉
查看一下系统的环境变量,输入以下代码
import sys print(sys.path)
我们来运行一下
首先通过 -m 方式运行
运行结果:
我们再通过图形界面直接运行的方式运行
对比发现好像有点不一样?
-m方式的第一个路径是
/Users/zhihengLi/Desktop/python_project/20211025
而图形界面直接运行方式为
/Users/zhihengLi/Desktop/python_project/20211025/test2
至此真相大白
结论:python -m方式第一个搜索路径为当前文件的所在目录路径,图形界面方式第一个搜索路径为当前文件的所在路径(即包含当前文件)
最后我们再用命令行直接启动方式运行
报错了
仔细看报错信息
can't open file '/Users/zhihengLi/Desktop/python_project/20211025/test2.b': [Errno 2] No such file or directory
test2.b?这是不是有点奇怪,因为路径前面都是/,而我们后面写的是 .
把 . 改为/行不行?
试试
怎么还是不行
要不加个后缀试试
成功了?!
且和图形界面直接运行仔细对比
这不就是图形界面的运行命令嘛
不管了,我们回到最开始的时间
那用这种方式能否调用a.py文件的A类?
修改b.py文件,调用A
两种运行方式结果
一种成功一种失败
我们上面已经知道了两种方式的sys.path搜索路径不一样
那改为一样是不是就可以了
试试
运行结果:
大功告成
总结
三种运行方式:
1.图形界面直接运行
2.python xxx.py
3.python3 -m xxx.xx
第1种和第2种本质上没有什么区别
这是两种加载py文件的方式,1和2叫做直接运行,3把模块当作脚本来启动
直接启动是把xx.py文件,所在的目录放到了sys.path属性中。
模块启动是把你输入命令的目录(也就是当前路径),放到了sys.path属性中
sys.path指定用于模块搜索路径的字符串列表。
直接运行的时候记得查看下搜索路径,若导入模块没有在路径中则会报错
此时可以把导入模块路径加入path中
注:上面sys.path.append只是临时修改path变量,想要永久修改变量可百度一下
其实还是有些不懂的地方,为什么加-m参数和不加-m参数运行的命令会不一样,一个用 . 一个用 / 之后再研究