python核心编程笔记--模块的导入
1. 模块的重新导入
有这样的一种情况:我们首先创建了一个.py文件,输入模块代码。保存后,我们进入ipython3的环境,引入这个模块。然后再ipython3环境外修改这个模块文件,在ipython3的环境中引入的模块文件会不会相应发生变化?
答案是:不会同步发生变化,需要重新引入
示例过程如下:
1.1 打开终端,新建一个.py文件,并简单输入一个print语句:
1.2 新开一个终端,在同一个目录输入ipython3命令,并引入test.py模块,进行测试
1.3 在原来创建test.py的终端修改test.py文件,此时ipython3的窗口不能关闭
1.4 再在之前的ipython3的窗口里,调用模块中的方法,看是否输出second
结论是:外层修改后,没有同步发生变化,由上图可以看出,在未关闭的情况下,即便是重新再引入一遍,还是没有同步改变。
解决方法:
a. 需要关闭impyhon3环境,重新导入
b. 使用reload
关于reload的用法,它属性imp模块,文档详情如下图所示:
至于为什么需要reload(),我们可以理解为,IPython3在第一次import的时候会去找你import的模块文件,然后就会把它放在某个地方,这样下次就不会再去找了。因此如果在外层修改了,里面是没有读取到修改后的文件的。
大家可以思考下,如果先打开一个IPyhon3的环境,然后重新打开一个终端,在相同目录新建一个模块文件,再回到之前打开的IPython3环境,我们可以直接import刚刚新建的模块吗?[根据上面的解释,显然是可以的,可以动手尝试下]
2. 关于python中引入模块文件方式的说明
当我们输入import 模块文件名 时,python是怎么找到模块文件的?如果找不到,python会报No modeule named '模块文件名'的错误
在ipython3的环境下,引入sys模块,里面有个变量,叫sys.path。这个变量是一个列表,它每一个元素存储的就是模块搜索的路径。搜索顺序是按结果顺序。
如果我们想在其他目录加入模块,则可以sys.path.append('目录')即可。即如果想对搜索路径做任何操作,比如修改顺序,添加目录,都只需要对sys.path(列表)操作即可。
目录路径以 / 开着
相对目录不以 / 开头
3. 模块的循环导入
a模块中引入了b,b模块中引入了a,结果会怎样?
答案是会报错
解决办法:抽取一个模块,专门用来调用,需要a就调用a,需要b就调用b