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参数运行的命令会不一样,一个用 . 一个用 /   之后再研究

posted @ 2021-10-25 21:41  zhihengLi  阅读(426)  评论(0编辑  收藏  举报