我想用random_word
包的另一个版本运行python方法。基本上,我安装了此软件包的2个版本,一个在'/home/arya/Documents/random-word'
中,另一个在'/home/arya/myvenv/lib/python3.6/site-packages'
中。因此,为了进行尝试,我从这段代码开始。
import sys
print(sys.path)
import random_word
print(random_word.__file__)
del random_word
sys.path[-2],sys.path[-1] = sys.path[-1],sys.path[-2]
print(sys.path)
import random_word
print(random_word.__file__)
跑步时
(myvenv) arya@arya-HP-Notebook:~/Desktop$ python test.py
它打印
sys.path : ['', '/home/arya/myvenv/lib/python3.6/site-packages', '/home/arya/Documents/random-word']
location of random_word package: /home/arya/myvenv/lib/python3.6/site-packages/random_word/__init__.py
sys.path : ['', '/home/arya/Documents/random-word', '/home/arya/myvenv/lib/python3.6/site-packages']
location of random_word package: /home/arya/myvenv/lib/python3.6/site-packages/random_word/__init__.py
我在random_word
中安装了/home/arya/Documents/random-word
软件包,另一安装在我的virtualenv的site-packages目录中。
所以,即使在更改sys.path
中目录的顺序后,我的疑问还是为什么我的python程序只能在random_word
中找到site-packages
?
注意::如果我在第一个import random_word
语句之前更改顺序,则python会选择安装在random_word
中的/home/arya/Documents/random-word
。我不明白为什么它不能在较早的情况下起作用。
谢谢。
答案 0 :(得分:2)
基本上,您看到的是模块缓存。导入模块时,Python会在内部缓存该模块,因此后续导入可以再次引用同一模块实例。 Python做了this optimization来防止必须再次重新编译模块。这也有效地使模块成为单例,因为它永远只能有一个实例。
通过调用del random_word
,您只是删除对该模块的引用,但不会卸载该模块。因此,当您以后再次导入random_word
模块时,Python实际上不会再次在导入路径中查找,而只会重用它已经拥有的模块。
这就是为什么在导入模块一次后更改路径顺序 不会产生任何作用。
有些问题涉及explicitly reloading already imported modules的概念,但我通常建议不要依赖它。缓存在那里是有充分的理由的,应该对模块进行相应的命名,以免在多个位置使用相同的模块名称而导致冲突。