环境准备
新建一个 foo 文件夹,其下包含一个 bar.py 文件
![b786ff45485cd22d965a0bf64e63f75d.png](https://i-blog.csdnimg.cn/blog_migrate/c2ba1a121237368ad746217f363dc74f.png)
bar.py 的内容非常简单,只写了个 print 语句
![6ceb4f645a3da67f033c8e8678811802.png](https://i-blog.csdnimg.cn/blog_migrate/0e7974316668241a8a22be8cd78c975c.png)
只要 bar.py 被导入一次,就被执行一次 print
禁止重复导入
由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。
![3bed4a265359a3dd8567f7799b53d30a.png](https://i-blog.csdnimg.cn/blog_migrate/f969f27b45f5a4f411d9d23f50172424.png)
重复导入方法一
如果你使用的 python2(记得前面在 foo 文件夹下加一个__init__.py
),有一个 reload 的方法可以直接使用
![e9f43965f911d01e69a38063fb3b438b.png](https://i-blog.csdnimg.cn/blog_migrate/b66a138a9eafbfe2bb86a30295e85f4f.png)
如果你使用的 python3 那方法就多了,详细请看下面
重复导入方法二
如果你使用 Python3.0 -> 3.3,那么可以使用 imp.reload 方法
![23aa96a96a6d67ee551e80b713e49e8d.png](https://i-blog.csdnimg.cn/blog_migrate/5b34ddc3d7074bfb0ecddcd0df713a69.png)
但是这个方法在 Python 3.4+,就不推荐使用了
![cdf3f9ceb02f12edcd11c68517259320.png](https://i-blog.csdnimg.cn/blog_migrate/645c47ed6fa4af7c5e0e86c1813078a5.png)
重复导入方法三
如果你使用的 Python 3.4+,请使用 importlib.reload 方法
![dd013fa10bebb00c1c0ae9edf83b997c.png](https://i-blog.csdnimg.cn/blog_migrate/02dfa7de63228be67b71a81455433e25.png)
重复导入方法四
如果你对包的加载器有所了解
还可以使用下面的方法
![8f3e5e3cf05e44ce765eefe115bb86b3.png](https://i-blog.csdnimg.cn/blog_migrate/ffe999e8481883dd8b1abca2e47f322f.png)
重复导入方法五
既然影响我们重复导入的是 sys.modules,那我们只要将已导入的包从其中移除是不是就好了呢?
![da473838b7dfb80a2b378a453b7d01ca.png](https://i-blog.csdnimg.cn/blog_migrate/f1722e17388587cc49e83100efb59f4e.png)
有没有发现在前面的例子里我使用的都是 from foo import bar,在这个例子里,却使用 import foo.bar,这是为什么呢?
这是因为如果你使用 from foo import bar 这种方式,想使用移除 sys.modules 来重载模块这种方法是失效的。
这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。
![fc5c303a18d3b334c61f074bdf85b1d9.png](https://i-blog.csdnimg.cn/blog_migrate/1f315e2f8725701d2cd56695329bebab.png)
转自:python模块重载的五种方法-侵删