最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题。
下面我来分享一下关于python中导入模块的一些基本知识。
1 导入模块时寻找路径
在每一个运行的python程序当中,都维护了一套sys文件,在这里面的path变量里,存储了在当前程序中导入模块时候寻找的路径。
上代码看一下:
1 import sys
2
3 if __name__ == '__main__':
4 file_path = sys.path
5 for i in file_path:
6 print(i)
7 '''
8 执行结果:
9 10 D:\Workspaces\PycharmProjects
11 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip
12 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs
13 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib
14 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35
15 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages
16 '''
请让我来 解释一下~
我们导入sys,查看了sys.path。path是一个列表,里边存储了多个路径,这些路径是如果我们进行import 模块操作的时候,python会从这个路径从第一个开始到最后一个一个一个路径去找我们的模块,直到找了或者都没找到,再抛出异常。
如果我们自己写的模块放在奇怪的地方,在程序中import自然是无法为导入的。这个时候怎么办呢??
我们可以向sys.path这个列表的第一个位置里插入一个路径,就是我们自己编写的模块存放的位置。这样python再找的时候就能找到了。
上代码:
1 import sys
2
3 if __name__ == '__main__':
4 sys.path.insert(0, ".\\" )
5
6 file_path = sys.path
7 for i in file_path:
8 print(i)
9 '''
10 执行结果:
11
12 .\
13 D:\Workspaces\PycharmProjects
14 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\python35.zip
15 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\DLLs
16 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib
17 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35
18 C:\Users\Mr.Cold\AppData\Local\Programs\Python\Python35\lib\site-packages
19 '''
这一次呢,我们在程序执行之前对sys.path进行了insert( 0 , str) ,这是列表的基本操作,在0号位置插入了str。这个str则是 模块所在的路径
我向里面插入了.\\代表当前路径,在打印结果中.\就占了第一个位置。
有些小伙伴有疑问 我添加的是.\\ 为什么出来的结果是.\
这个问题呢是字符串的转义问题。在编程语言和操作系统中,识别 \ 是有特殊含义的,比如 \n 代表换行 \r 代表回车 \0 代表字符串结束等等。
当解析器遇到\ 他会默认和后面一个字符组合成一个字符。我们输入 \\ 其实是告诉计算机 我们想要输入的是 \ , 这是转义字符的基本概念哦~
2 模块的重导入
有的时候,我们程序在运行着,然后我们改变了程序内用到的模块的一些内容,但是程序运行结果没有按照我们修改的模块内容改变。
这个时候 即使我们再import 模块 运行结果还是没有改变。
这个时候要普及一下python解释器导入模块的一些基础知识:
当第一次import 模块 的时候,这个模块就常驻内存了,代码等都已经复制过来。每次调用模块方法的时候不会再去找模块内的代码,而是在内存中直接使用。所以当我们修改模块内代码,程序运行结果没有变,因为程序只导入了一次模块,并且记住里面所有东西。之后调用模块方法全凭内存内的记忆!
即使我们再import 模块,python认为 我的内存当中有这个模块我们已经导入过了,就会忽略这个语句,不会导入了。
那怎么办呢????
这时候我们需要使用模重导入:
1 import imp
2 imp.reload(a) #把我们要重新导入的模块a进行重新导入
3 a.a()
这样就ok啦! 更新了内存当中之前导入的模块啦!