从另一个安装目录导入软件包以获取特定方法

时间:2018-08-05 16:55:54

标签: python-3.x sys

我想用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。我不明白为什么它不能在较早的情况下起作用。

谢谢。

1 个答案:

答案 0 :(得分:2)

基本上,您看到的是模块缓存。导入模块时,Python会在内部缓存该模块,因此后续导入可以再次引用同一模块实例。 Python做了this optimization来防止必须再次重新编译模块。这也有效地使模块成为单例,因为它永远只能有一个实例。

通过调用del random_word,您只是删除对该模块的引用,但不会卸载该模块。因此,当您以后再次导入random_word模块时,Python实际上不会再次在导入路径中查找,而只会重用它已经拥有的模块。

这就是为什么在导入模块一次后更改路径顺序 不会产生任何作用。

有些问题涉及explicitly reloading already imported modules的概念,但我通常建议不要依赖它。缓存在那里是有充分的理由的,应该对模块进行相应的命名,以免在多个位置使用相同的模块名称而导致冲突。